在我的应用程序中,我在数据库中有一些用户角色。我需要从数据库中获取这些角色并实现基于角色的身份验证。
我正在尝试将一个服务(我可以从数据库中获取用户角色)注入到一个名为“Role”的自定义装饰器中,并在我的控制器中使用这个装饰器来实现基于角色的身份验证。知道如何向自定义装饰器注入服务吗?
尝试用守卫和装饰器来实现这一点,但失败了
我可以建议一种对我在 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,
) {}
...
希望有帮助!