Ответ
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) или любой другой бизнес-логики, которая должна решать, может ли запрос быть обработан.
Ответ 18+ 🔞
Слушай, объясню тебе про эти Guards в NestJS, чтобы ты не ломал голову, как какой-нибудь мартышлюшка с винтом. Это, по сути, такие здоровенные вышибалы на входе в клуб. Их задача — проверить твой фейс-контроль, прежде чем пустить внутрь, к самому эндпоинту.
Что они из себя представляют, ёпта:
- Работают после мидлваров, но до всех остальных — перехватчиков и пайпов. Порядок, бля, важен!
- У них есть доступ ко всему контексту запроса (
ExecutionContext), то есть они могут залезть вrequestи посмотреть, кто там пришёл. - Главное правило — они должны чётко сказать: пустить (
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; // Допустим, мидлвар уже прикрутил юзера к запросу
// Если юзера нет или он не аутентифицирован — в пизду, дорогой
if (!user || !user.isAuthenticated) {
throw new UnauthorizedException('Пользователь не аутентифицирован');
}
return true; // Всё чики-пуки, проходи
}
}
А вот как этим чудом пользоваться на контроллере:
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';
@Controller('profile')
@UseGuards(AuthGuard) // Теперь этот стражник стоит на всех методах контроллера
export class ProfileController {
@Get()
getProfile() {
return { message: 'Доступ к профилю разрешен' };
}
}
Если коротко и на пальцах: Гварды — это твои главные по безопасности. Хочешь сделать доступ только для админов? Гвард на основе ролей. Нужно проверить, принадлежит ли запрашиваемый ресурс именно этому юзеру? Снова гвард. Вся логика «можно или нельзя» живёт тут, а не размазывается по коду, как сопли. Удобно, чё.