roles.guard.ts 827 B

12345678910111213141516171819202122232425262728
  1. import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
  2. import { Reflector } from '@nestjs/core';
  3. import { ROLES_KEY } from './roles.decorator';
  4. import { UserRole } from '../user/user-role.enum';
  5. @Injectable()
  6. export class RolesGuard implements CanActivate {
  7. constructor(private reflector: Reflector) {}
  8. canActivate(context: ExecutionContext): boolean {
  9. const requiredRoles = this.reflector.getAllAndOverride<UserRole[]>(
  10. ROLES_KEY,
  11. [context.getHandler(), context.getClass()],
  12. );
  13. if (!requiredRoles) {
  14. return true;
  15. }
  16. const { user } = context.switchToHttp().getRequest();
  17. // User might not be injected yet if auth guard fails, but auth guard runs first usually.
  18. if (!user) {
  19. return false;
  20. }
  21. return requiredRoles.includes(user.role);
  22. }
  23. }