Полное руководство по использованию декораторов для ролей в NestJS

Декораторы в NestJS предоставляют мощный способ расширения и изменения поведения классов, методов и свойств. Одним из распространенных вариантов использования декораторов является реализация авторизации и аутентификации на основе ролей в приложении. В этой статье мы рассмотрим различные методы использования декораторов для ролей в NestJS, а также приведем примеры кода.

  1. Авторизация роли на уровне метода.
    Один из подходов — использовать декоратор метода для ограничения доступа к определенным конечным точкам в зависимости от роли пользователя. Вот пример:
import { SetMetadata } from '@nestjs/common';
export const Roles = (...roles: string[]) => SetMetadata('roles', roles);

В контроллере или обработчике вы можете применить декоратор @Rolesк нужному методу, указав разрешенные роли в качестве аргументов:

import { Roles } from './roles.decorator';
@Post('admin-only')
@Roles('admin')
async adminOnlyEndpoint() {
  // Logic for the admin-only endpoint
}
  1. Авторизация ролей на уровне контроллера.
    Другой подход — применить декоратор @Rolesна уровне контроллера. Это гарантирует, что все методы внутри контроллера будут доступны только пользователям с указанными ролями:
import { Roles } from './roles.decorator';
@Roles('admin')
@Controller('admin')
export class AdminController {
  @Post('create-user')
  createUser() {
    // Logic to create a user
  }
  @Delete('delete-user')
  deleteUser() {
    // Logic to delete a user
  }
}
  1. Динамическая авторизация ролей.
    Иногда может потребоваться динамическое определение разрешенных ролей на основе условий выполнения. Этого можно добиться, создав собственный декоратор, принимающий функцию обратного вызова:
import { SetMetadata } from '@nestjs/common';
export const DynamicRoles = (callback: () => string[]) => SetMetadata('roles', callback);

В этом примере функция callbackдолжна возвращать массив ролей на основе текущего контекста. Затем вы можете использовать декоратор @DynamicRolesаналогично декоратору @Roles.

Декораторы в NestJS предлагают гибкий и элегантный способ реализации авторизации и аутентификации на основе ролей. Используя декораторы, вы можете легко ограничить доступ к определенным конечным точкам или целым контроллерам в зависимости от роли пользователя. Кроме того, динамическая авторизация ролей обеспечивает более детальный контроль над разрешениями на доступ. Эффективно используя декораторы, вы можете повысить безопасность и целостность вашего приложения NestJS.

Не забывайте всегда применять передовые методы обеспечения безопасности и аутентификации, такие как использование безопасных механизмов аутентификации на основе токенов и проверка ролей пользователей на стороне сервера.