RBAC cho phép kiểm soát quyền truy cập dựa trên role của user. Pattern chuẩn:
Bước 1: tạo @Roles() decorator:
typescript
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);Bước 2: tạo RolesGuard:
typescript
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(ctx: ExecutionContext): boolean {
const required = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
ctx.getHandler(), ctx.getClass(),
]);
if (!required) return true; // No roles required
const { user } = ctx.switchToHttp().getRequest();
return required.some(role => user.roles?.includes(role));
}
}Bước 3: đăng ký global và dùng:
typescript
@Roles(Role.ADMIN)
@Get('admin-only')
getAdminData() { ... }Ngoài roles, có thể implement Permission-based (fine-grained) với casl library: ability.can(Action.Update, 'User').
Pitfall: guard chạy sau JWT guard — đảm bảo user object đã được attach vào request trước khi roles guard chạy.