Что такое Guards в NestJS?

«Что такое Guards в NestJS?» — вопрос из категории NestJS, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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) или любой другой бизнес-логики, которая должна решать, может ли запрос быть обработан.