Bird
Raised Fist0
NestJSframework~20 mins

Role-based guards in NestJS - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Role-based Guard Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the output of this NestJS guard when a user with role 'user' tries to access?

Consider this role-based guard in NestJS that allows access only to users with the 'admin' role.

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';

@Injectable()
export class RolesGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    return user?.roles?.includes('admin');
  }
}

If a request has user.roles = ['user'], what will the guard return?

Atrue
Bfalse
Cundefined
Dthrows a runtime error
Attempts:
2 left
💡 Hint

Check if the roles array includes 'admin'.

📝 Syntax
intermediate
2:00remaining
Which option correctly applies a RolesGuard to a controller method in NestJS?

Given a RolesGuard class, which of the following code snippets correctly applies it to a controller method?

A
@UseGuards(RolesGuard)
@Get('admin')
getAdminData() { return 'data'; }
B
@UseGuard(RolesGuard)
@Get('admin')
getAdminData() { return 'data'; }
C
@UseGuards(RolesGuard())
@Get('admin')
getAdminData() { return 'data'; }
D
@UseGuards('RolesGuard')
@Get('admin')
getAdminData() { return 'data'; }
Attempts:
2 left
💡 Hint

Check the correct decorator name and usage syntax.

🔧 Debug
advanced
3:00remaining
Why does this RolesGuard always deny access even for 'admin' users?

Examine this RolesGuard code:

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';

@Injectable()
export class RolesGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    if (!user) return false;
    if (user.roles === 'admin') {
      return true;
    }
    return false;
  }
}

Users have roles as an array of strings, e.g., ['admin']. Why does this guard deny access to admins?

ABecause the guard never returns true
BBecause request.user is undefined
CBecause it compares an array to a string with ===, which is always false
DBecause the guard is missing @Injectable decorator
Attempts:
2 left
💡 Hint

Check how roles are compared.

❓ state_output
advanced
2:00remaining
What is the value of 'hasAccess' after running this guard with user roles ['editor', 'admin']?

Given this guard snippet:

canActivate(context: ExecutionContext): boolean {
  const request = context.switchToHttp().getRequest();
  const user = request.user;
  const allowedRoles = ['admin', 'superuser'];
  const hasAccess = user.roles.some(role => allowedRoles.includes(role));
  return hasAccess;
}

If user.roles = ['editor', 'admin'], what is the value of hasAccess?

Atrue
Bundefined
Cthrows a TypeError
Dfalse
Attempts:
2 left
💡 Hint

Check if any user role matches allowedRoles.

🧠 Conceptual
expert
2:30remaining
Which statement best describes the purpose of role-based guards in NestJS?

Choose the most accurate description of role-based guards in NestJS.

AThey replace the need for authentication by verifying user identity
BThey automatically assign roles to users when they log in
CThey encrypt user roles to secure them in the database
DThey restrict access to routes based on user roles by checking roles during request handling
Attempts:
2 left
💡 Hint

Think about what guards do in NestJS.

Practice

(1/5)
1. What is the main purpose of a role-based guard in NestJS?
easy
A. To manage application configuration
B. To handle database connections
C. To format HTTP responses
D. To restrict access to routes based on user roles

Solution

  1. Step 1: Understand role-based guard function

    Role-based guards check user roles before allowing access to routes.
  2. Step 2: Identify the correct purpose

    Restricting access based on roles matches the guard's role in security.
  3. Final Answer:

    To restrict access to routes based on user roles -> Option D
  4. Quick Check:

    Role-based guard = restrict access by roles [OK]
Hint: Guards control access; roles limit who can enter [OK]
Common Mistakes:
  • Confusing guards with database or config management
  • Thinking guards format responses
  • Assuming guards handle unrelated tasks
2. Which of the following is the correct way to apply a role-based guard to a route in NestJS?
easy
A. @UseGuards(RolesGuard)\n@Get('profile')
B. @Controller('profile')\n@RolesGuard()
C. @Roles('admin')\n@UseGuards(AuthGuard)
D. @UseGuards(AuthGuard)\n@Get('profile')

Solution

  1. Step 1: Identify correct guard usage syntax

    Use @UseGuards with the guard class to apply it to routes.
  2. Step 2: Match with role-based guard usage

    @UseGuards(RolesGuard) is correct; @Roles decorator marks roles separately.
  3. Final Answer:

    @UseGuards(RolesGuard)\n@Get('profile') -> Option A
  4. Quick Check:

    @UseGuards(RolesGuard) applies guard [OK]
Hint: Use @UseGuards with guard class to protect routes [OK]
Common Mistakes:
  • Using @RolesGuard() instead of @UseGuards
  • Mixing @Roles and @UseGuards incorrectly
  • Applying guards without @UseGuards decorator
3. Given this guard code snippet, what will be the result if the user role is 'user' and the route requires 'admin' role?
canActivate(context: ExecutionContext) {
  const roles = this.reflector.get('roles', context.getHandler());
  const request = context.switchToHttp().getRequest();
  const user = request.user;
  return roles.includes(user.role);
}
medium
A. Access granted
B. Access denied
C. Runtime error due to missing roles
D. Always returns true

Solution

  1. Step 1: Understand role check logic

    The guard checks if the user's role is included in the allowed roles array.
  2. Step 2: Apply given roles and user role

    User role is 'user', route requires 'admin', so roles.includes('user') is false.
  3. Final Answer:

    Access denied -> Option B
  4. Quick Check:

    User role not in allowed roles = deny access [OK]
Hint: Check if user role is in allowed roles array [OK]
Common Mistakes:
  • Assuming access is granted if roles differ
  • Thinking roles includes user role always
  • Ignoring roles array presence
4. Identify the error in this role-based guard implementation:
canActivate(context: ExecutionContext) {
  const roles = this.reflector.get('roles', context.getHandler());
  const request = context.switchToHttp().getRequest();
  const user = request.user;
  if (!roles) {
    return false;
  }
  return roles.includes(user.role);
}
medium
A. Returns false if no roles metadata, blocking all access
B. Missing async keyword causes runtime error
C. Incorrect use of context.getHandler()
D. Should check user permissions instead of roles

Solution

  1. Step 1: Analyze roles metadata check

    If roles metadata is missing, the guard returns false blocking access.
  2. Step 2: Understand typical behavior for missing roles

    Usually, missing roles means no restriction, so returning false is too strict.
  3. Final Answer:

    Returns false if no roles metadata, blocking all access -> Option A
  4. Quick Check:

    No roles metadata should allow access, not block [OK]
Hint: Missing roles metadata should not block access by default [OK]
Common Mistakes:
  • Assuming missing roles means deny access
  • Forgetting to handle undefined roles gracefully
  • Confusing async necessity in this context
5. You want to create a role-based guard that allows access if the user has any one of multiple roles specified on a route. Which approach correctly implements this behavior?
hard
A. Use multiple guards each checking one role and combine them with @UseGuards
B. Check only the first role in roles array against user.role in canActivate
C. Use @Roles('admin', 'editor') decorator and check if user.role is included in roles array inside canActivate
D. Ignore roles and allow access to all authenticated users

Solution

  1. Step 1: Understand multiple roles in @Roles decorator

    @Roles can accept multiple roles as arguments to specify allowed roles.
  2. Step 2: Implement canActivate to check inclusion

    Checking if user.role is in roles array allows access if user has any allowed role.
  3. Final Answer:

    Use @Roles('admin', 'editor') decorator and check if user.role is included in roles array inside canActivate -> Option C
  4. Quick Check:

    Check user role in roles array for multiple allowed roles [OK]
Hint: Check if user role is in roles array for multiple roles [OK]
Common Mistakes:
  • Checking only first role ignores others
  • Using multiple guards unnecessarily
  • Allowing all authenticated users ignores roles
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