Concept Flow - Role-based guards
Request comes in
Guard checks user roles
Has Role
Allow
Controller
The guard intercepts a request, checks if the user has the required role, then allows or denies access accordingly.
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'); } }
| Step | Action | User Roles | Condition | Result |
|---|---|---|---|---|
| 1 | Request received | ['user', 'admin'] | Check if 'admin' in roles | True |
| 2 | Guard allows access | ['user', 'admin'] | Return true | Access granted |
| 3 | Request received | ['user'] | Check if 'admin' in roles | False |
| 4 | Guard denies access | ['user'] | Return false | Access denied |
| Variable | Start | After Step 1 | After Step 2 | After Step 3 | After Step 4 |
|---|---|---|---|---|---|
| user.roles | undefined | ['user', 'admin'] | ['user', 'admin'] | ['user'] | ['user'] |
| condition ('admin' in roles) | undefined | true | true | false | false |
| guard result | undefined | undefined | true | undefined | false |
Role-based guards in NestJS check user roles before allowing access.
Use canActivate method to inspect request user roles.
Return true to allow, false to deny.
Ensure user roles exist to avoid errors.
Common pattern: user.roles.includes('requiredRole').