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 при необходимости.