Ответ
Guards в NestJS — это декораторы, реализующие интерфейс CanActivate. Они предназначены для централизованной проверки прав доступа к маршрутам (эндпоинтам) на основе заданных условий (например, роли, права, состояние аутентификации).
Ключевые особенности:
- Выполняются посредниками (middleware), но перед перехватчиками (interceptors) и обработчиками запросов (pipes) в конвейере запроса.
- Имеют доступ к
ExecutionContext, что позволяет получить объекты запроса и ответа. - Должны возвращать
booleanилиPromise<boolean>. Значениеtrueразрешает выполнение запроса,false— завершает его с ошибкойForbiddenException(по умолчанию). - Могут быть применены на уровне: глобального модуля, контроллера или отдельного метода.
Пример Guard для проверки аутентификации:
import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
const user = request.user; // Предполагается, что пользователь добавлен в запрос ранее (например, в middleware)
if (!user || !user.isAuthenticated) {
throw new UnauthorizedException('Пользователь не аутентифицирован');
}
return true;
}
}
Применение Guard к контроллеру:
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';
@Controller('profile')
@UseGuards(AuthGuard) // Guard применяется ко всем методам контроллера
export class ProfileController {
@Get()
getProfile() {
return { message: 'Доступ к профилю разрешен' };
}
}
Практическое использование: Guards идеально подходят для реализации политик авторизации на основе ролей (RBAC), проверки прав доступа к ресурсам (ACL) или любой другой бизнес-логики, которая должна решать, может ли запрос быть обработан.