Опишите, как настроить и использовать Guards.
Guards в NestJS используются для управления доступом к маршрутам
Короткий ответ
Guards реализуют интерфейс CanActivate, который содержит метод canActivate. Этот метод возвращает true или false (или Promise/Observable), указывая, разрешен ли доступ к маршруту. Guards можно применять глобально, к отдельным контроллерам или маршрутам с помощью декоратора @UseGuards.
Длинный ответ
Основные аспекты работы Guards:
1. Guards определяются как классы, которые реализуют интерфейс CanActivate.
2. Метод canActivate получает объект ExecutionContext, который предоставляет доступ к объектам запроса и другим данным.
3. Guards возвращают:
- true/false для синхронной логики.
- Promise/Observable для асинхронных проверок (например, запросы в базу данных).
Пример использования Guards:
- Guard:
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
return this.validateRequest(request);
}
validateRequest(request): boolean {
// Добавьте вашу логику аутентификации
return true; // true для разрешения, false для отказа
}
}- Применение Guard:
import { Controller, Get, UseGuards } from '@nestjs/common';
@Controller('cats')
class CatsController {
@Get()
@UseGuards(AuthGuard)
findAll() {
return 'This route is protected by AuthGuard';
}
}- Глобальное использование Guards:
Guards можно зарегистрировать глобально в корневом модуле:
import { APP_GUARD } from '@nestjs/core';
@Module({
providers: [
{
provide: APP_GUARD,
useClass: AuthGuard,
},
],
})
export class AppModule {}
Guards предоставляют мощный инструмент для управления доступом в приложениях NestJS, особенно полезный для внедрения аутентификации и авторизации.