📖 Scenario: You are building a simple NestJS backend for a company. Different users have different roles like admin and user. You want to protect certain routes so only users with the right role can access them.
🎯 Goal: Create a role-based guard in NestJS that checks if a user has the required role before allowing access to a route.
📋 What You'll Learn
Create a roles array to hold user roles
Create a constant for the required role
Implement a guard class that checks user roles
Apply the guard to a controller route
💡 Why This Matters
🌍 Real World
Role-based guards are used in real applications to restrict access to certain parts of a backend API based on user permissions.
💼 Career
Understanding role-based guards is essential for backend developers working with NestJS to build secure and maintainable applications.
Progress0 / 4 steps
1
Create a roles array
Create a constant array called roles with the exact values 'admin' and 'user'.
NestJS
Hint
Use const roles = ['admin', 'user']; to create the array.
2
Create a required role constant
Create a constant called requiredRole and set it to the string 'admin'.
NestJS
Hint
Use const requiredRole = 'admin'; to set the required role.
3
Implement the role guard class
Create a class called RolesGuard that implements CanActivate. Inside, write a canActivate method that takes context and returns true only if requiredRole is included in roles.
NestJS
Hint
Use roles.includes(requiredRole) inside canActivate to check the role.
4
Apply the guard to a controller route
In a controller class called AppController, create a method getAdminData decorated with @Get('admin') and @UseGuards(RolesGuard). The method should return the string 'Admin content'.
NestJS
Hint
Use @UseGuards(RolesGuard) above the method to protect the route.
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
Step 1: Understand role-based guard function
Role-based guards check user roles before allowing access to routes.
Step 2: Identify the correct purpose
Restricting access based on roles matches the guard's role in security.
Final Answer:
To restrict access to routes based on user roles -> Option D
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
Step 1: Identify correct guard usage syntax
Use @UseGuards with the guard class to apply it to routes.
Step 2: Match with role-based guard usage
@UseGuards(RolesGuard) is correct; @Roles decorator marks roles separately.
Final Answer:
@UseGuards(RolesGuard)\n@Get('profile') -> Option A
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?
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
Step 1: Analyze roles metadata check
If roles metadata is missing, the guard returns false blocking access.
Step 2: Understand typical behavior for missing roles
Usually, missing roles means no restriction, so returning false is too strict.
Final Answer:
Returns false if no roles metadata, blocking all access -> Option A
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
Step 1: Understand multiple roles in @Roles decorator
@Roles can accept multiple roles as arguments to specify allowed roles.
Step 2: Implement canActivate to check inclusion
Checking if user.role is in roles array allows access if user has any allowed role.
Final Answer:
Use @Roles('admin', 'editor') decorator and check if user.role is included in roles array inside canActivate -> Option C
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 unknownstrongwhile earning +1 Grip toward your certificate.