intermediate

NestJS guards

Используйте guards для authentication и authorization decisions с metadata, execution contexts и explicit denial behavior.

Guards реализуют `CanActivate` и выполняются до route handlers — отвечают «можно ли продолжить request?». Authentication и authorization здесь, не в controllers или services.

					@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    if (!roles) return true;
    const { user } = context.switchToHttp().getRequest();
    return roles.some((role) => user?.roles?.includes(role));
  }
}
				

Guards через `@UseGuards(AuthGuard, RolesGuard)` на controller или handler. `@SetMetadata('roles', ['admin'])` с custom guards. `ExecutionContext` абстрагирует HTTP, RPC и WebSocket.

На интервью: guards vs middleware (у middleware нет DI и route metadata), JWT validation flow, явный отказ (`ForbiddenException`).

Типовые ошибки: дублирование authorization в services, тяжёлый sync I/O в guards, забытый guard на новых endpoints.

Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.

Чеклист:

  • Guards для authn/authz.
  • Metadata + Reflector для roles.
  • Framework exceptions при отказе.
  • Быстрые guards; кэш policy lookups при необходимости.