Bird
Raised Fist0
GraphQLquery~20 mins

Role-based access control in GraphQL - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Role-based Access Control Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
Query Result: Fetching User Roles

Given the following GraphQL query to fetch user roles, what will be the output?

query { user(id: "123") { id name roles } }

Assume the user with id "123" has roles: ["admin", "editor"]

GraphQL
query { user(id: "123") { id name roles } }
A{"data":{"user":{"id":"123","name":"Alice","roles":["admin","editor"]}}}
B{"data":{"user":{"id":"123","name":"Alice","roles":["user"]}}}
C{"errors":[{"message":"User not found"}]}
D{"data":{"user":null}}
Attempts:
2 left
💡 Hint

Check the roles assigned to the user with id "123".

🧠 Conceptual
intermediate
1:30remaining
Understanding Role Hierarchies

In a role-based access control system, which statement best describes role hierarchies?

ARoles can inherit permissions from other roles, allowing hierarchical access control.
BRoles are independent and cannot inherit permissions from other roles.
CUsers can only have one role at a time, so hierarchies are unnecessary.
DRole hierarchies mean roles are assigned randomly without structure.
Attempts:
2 left
💡 Hint

Think about how permissions can be shared or extended between roles.

📝 Syntax
advanced
2:00remaining
GraphQL Schema for Role-based Access Control

Which of the following GraphQL schema snippets correctly defines a User type with roles as a list of strings?

GraphQL
type User { id: ID! name: String! roles: [String!]! }
Atype User { id: ID name: String roles: String }
Btype User { id: ID! name: String! roles: [String!]! }
Ctype User { id: ID! name: String! roles: String! }
Dtype User { id: ID! name: String! roles: [String] }
Attempts:
2 left
💡 Hint

Roles should be a non-null list of non-null strings.

❓ optimization
advanced
2:30remaining
Optimizing Role Checks in GraphQL Resolvers

You want to optimize role checks in your GraphQL resolvers to avoid repeated database calls. Which approach is best?

AFetch roles only when an error occurs.
BFetch user roles separately in each resolver to ensure fresh data.
CIgnore roles and allow all access to simplify code.
DFetch user roles once per request and cache them in context for all resolvers.
Attempts:
2 left
💡 Hint

Think about efficiency and avoiding repeated work.

🔧 Debug
expert
3:00remaining
Debugging Role-based Access Control Error

Given this resolver snippet, what error will occur if the user object is null?

const resolver = (parent, args, context) => { if (!context.user.roles.includes('admin')) { throw new Error('Access denied'); } return 'Success'; }
ANo error, returns 'Success'
BReferenceError: roles is not defined
CTypeError: Cannot read property 'includes' of null
DError: Access denied
Attempts:
2 left
💡 Hint

Consider what happens if context.user is null.

Practice

(1/5)
1. What is the main purpose of role-based access control (RBAC) in GraphQL APIs?
easy
A. To format the response data
B. To speed up query execution
C. To restrict data access based on user roles
D. To cache query results

Solution

  1. Step 1: Understand RBAC concept

    RBAC limits what data users can access depending on their assigned roles.
  2. Step 2: Identify RBAC purpose in GraphQL

    In GraphQL, RBAC ensures users only see or modify data allowed by their role.
  3. Final Answer:

    To restrict data access based on user roles -> Option C
  4. Quick Check:

    RBAC = restrict access by role [OK]
Hint: RBAC controls who can see or change data [OK]
Common Mistakes:
  • Confusing RBAC with performance optimization
  • Thinking RBAC formats data output
  • Assuming RBAC caches data
2. Which of the following is the correct way to apply a role-based directive in a GraphQL schema to restrict a query to admins only?
easy
A. type Query { users: [User] @hasRole(role: "admin") }
B. type Query { users: [User] @roleCheck("admin") }
C. type Query { users: [User] @auth(role: "admin") }
D. type Query { users: [User] @access(role = admin) }

Solution

  1. Step 1: Identify correct directive syntax

    The standard directive for role checks is @hasRole with a role argument as a string.
  2. Step 2: Match syntax to options

    type Query { users: [User] @hasRole(role: "admin") } uses @hasRole(role: "admin"), which is the correct syntax.
  3. Final Answer:

    type Query { users: [User] @hasRole(role: "admin") } -> Option A
  4. Quick Check:

    @hasRole(role: "admin") syntax correct [OK]
Hint: Look for @hasRole with role as string argument [OK]
Common Mistakes:
  • Using incorrect directive names like @auth or @roleCheck
  • Missing quotes around role name
  • Using = instead of : in directive arguments
3. Given this GraphQL query protected by @hasRole(role: "editor"), what will happen if a user with role "viewer" tries to run it?
query { editArticle(id: "123") { title content } }
medium
A. The query returns an authorization error
B. The query returns empty data with no error
C. The query returns the article data as usual
D. The query causes a server crash

Solution

  1. Step 1: Understand role restriction effect

    @hasRole(role: "editor") restricts access to users with the editor role only.
  2. Step 2: Check user role against required role

    User has role "viewer", which does not match "editor", so access is denied.
  3. Final Answer:

    The query returns an authorization error -> Option A
  4. Quick Check:

    Role mismatch = authorization error [OK]
Hint: Role mismatch causes authorization error [OK]
Common Mistakes:
  • Assuming query returns data anyway
  • Thinking query returns empty data silently
  • Believing server crashes on role denial
4. You wrote this schema directive to restrict a mutation to admins:
type Mutation { deleteUser(id: ID!): Boolean @hasRole(role: admin) }

Why does this cause a syntax error?
medium
A. The directive name @hasRole is invalid
B. ID! is not a valid type
C. Mutation type cannot have directives
D. The role value admin is missing quotes

Solution

  1. Step 1: Check directive argument syntax

    Directive arguments require string values in quotes, e.g., role: "admin".
  2. Step 2: Identify missing quotes error

    Here, role: admin lacks quotes, causing a syntax error.
  3. Final Answer:

    The role value admin is missing quotes -> Option D
  4. Quick Check:

    Directive string args need quotes [OK]
Hint: Always put role names in quotes in directives [OK]
Common Mistakes:
  • Thinking directive names are wrong
  • Believing directives can't be on mutations
  • Misunderstanding ID! type syntax
5. You want to allow only users with roles "admin" or "manager" to update product prices. Which schema directive setup correctly enforces this in GraphQL?
hard
A. type Mutation { updatePrice(id: ID!, price: Float): Product @hasAnyRole(roles: ["admin", "manager"]) }
B. type Mutation { updatePrice(id: ID!, price: Float): Product @hasRole(role: ["admin", "manager"]) }
C. type Mutation { updatePrice(id: ID!, price: Float): Product @hasRole(role: "admin") @hasRole(role: "manager") }
D. type Mutation { updatePrice(id: ID!, price: Float): Product @hasRole(roles: "admin,manager") }

Solution

  1. Step 1: Understand multi-role directive syntax

    @hasRole accepts an array of roles to allow multiple roles access.
  2. Step 2: Evaluate options for correct syntax

    type Mutation { updatePrice(id: ID!, price: Float): Product @hasRole(role: ["admin", "manager"]) } uses @hasRole(role: ["admin", "manager"]), which correctly passes an array of roles.
  3. Step 3: Identify incorrect options

    type Mutation { updatePrice(id: ID!, price: Float): Product @hasRole(roles: "admin,manager") } passes a string, not an array; C uses multiple directives which may not combine logically; A uses a non-standard directive @hasAnyRole.
  4. Final Answer:

    type Mutation { updatePrice(id: ID!, price: Float): Product @hasRole(role: ["admin", "manager"]) } -> Option B
  5. Quick Check:

    Array of roles in @hasRole = correct [OK]
Hint: Use array syntax for multiple roles in @hasRole [OK]
Common Mistakes:
  • Passing roles as comma string instead of array
  • Using multiple @hasRole directives expecting OR logic
  • Using non-standard directive names
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard