将服务注入到nestjs中的自定义装饰器中

问题描述 投票:0回答:1

在我的应用程序中,我在数据库中有一些用户角色。我需要从数据库中获取这些角色并实现基于角色的身份验证。

我正在尝试将一个服务(我可以从数据库中获取用户角色)注入到一个名为“Role”的自定义装饰器中,并在我的控制器中使用这个装饰器来实现基于角色的身份验证。知道如何向自定义装饰器注入服务吗?

尝试用守卫和装饰器来实现这一点,但失败了

nestjs decorator roles
1个回答
0
投票

我可以建议一种对我在 NestJs 中构建基于角色的授权有用的不同方法吗?

首先,将角色添加到您的 auth-guard 中的用户对象中。您可以通过从您自己构建的访问策略查询数据库来完成此操作。您可以在此处使用 Passport 在 NestJS 文档中查看完整示例。

完成此操作后,您可以使用用户对象上的 userRole 来将角色与角色防护中的角色进行比较。

角色.guard.ts:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Role } from './role.enum';
import { ROLES_KEY } from './roles.decorator';

@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (!requiredRoles) {
      return true;
    }
    const { user } = context.switchToHttp().getRequest();
    if (!user) {
      return false;
    }
    // This is where the actual checking happens
    return requiredRoles.some((role) => user.userRole === role);
  }
}

roles.decorator.ts:

export const ROLES_KEY = 'roles';
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);

角色.enum.ts

export enum Role {
  User = 2,
  Admin = 1,
}

您的控制器:

@Controller('admin')
@ApiHeader({
  name: 'Authorization',
  description: 'Bearer...',
})
@Roles(Role.Admin) // Here is your decorator where you specify which user you want to be able to access this. 
@UseGuards(AccessGuard, RolesGuard)
@ApiTags('Admin')
@ApiBearerAuth('accessJWT')
export class AdminController {
  constructor(
    @Inject(YourService)
    private readonly yourService: YourService,
  ) {}
...

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.