Nestjs 如何创建一个动态角色守卫,以便在控制器和处理程序中工作

Nestjs 如何创建一个动态角色守卫,以便在控制器和处理程序中工作,nestjs,nestjs-passport,Nestjs,Nestjs Passport,我定义的角色是这样的: 从'@nestjs/common'导入{CanActivate,ExecutionContext,Injectable}; 从'@nestjs/core'导入{Reflector}; 从“rxjs”导入{Observable}; 从“./User.entity”导入{User}; @可注射() 导出类RolesGuard实现CanActivate{ 建造师( 专用反射器:反射器, ) { } 异步匹配角色(角色:字符串[],用户角色:用户[“角色”]){ 让match=f

我定义的角色是这样的:

从'@nestjs/common'导入{CanActivate,ExecutionContext,Injectable};
从'@nestjs/core'导入{Reflector};
从“rxjs”导入{Observable};
从“./User.entity”导入{User};
@可注射()
导出类RolesGuard实现CanActivate{
建造师(
专用反射器:反射器,
) { }
异步匹配角色(角色:字符串[],用户角色:用户[“角色”]){
让match=false;
if(roles.indexOf(userRole)>-1){
匹配=真;
}
复赛
}
激活(
上下文:ExecutionContext,
):布尔值|承诺|可观察{
const roles=this.reflector.get('roles',context.getClass());
如果(!角色){
返回true;
}
const request=context.switchToHttp().getRequest();
const user:user=request.user;
返回此.matchRoles(角色,用户.roles)
}
}
在此角色示例中,它仅在控制器级别工作,如下所示:

@控制器(“游戏”)
@hasRoles('用户')
@UseGuard(AuthGuard()、JwtGuard、RolesGuard)
导出类游戏控制器{
...
但我希望它在控制器级别和处理程序级别都能动态工作。 因此,我可以为控制器中的每个路由应用
@hasRoles('user')
,并为该控制器中的某些路由应用
@hasRoles('admin')


为此,我需要动态地将reflector方法从
getClass
更改为
getHandler

Nest的
reflector
有一个内置方法,可以将控制器和路由处理程序上的元数据集与
getAllAndMerge
合并,这将合并类和方法中的元数据。要使用它,您需要你会做类似的事情吗

const roles=this.reflector.getAllAndMerge(
"角色",,
[
context.getHandler(),
context.getClass()
]
);
如果您只想获取一组元数据并有一个回退(例如,如果您只需要处理程序元数据(如果它存在),如果不获取类的元数据),则可以以类似的方式使用
getAllAndOverride

const roles=this.reflector.getAllAndOverride(
"角色",,
[
context.getHandler(),
context.getClass()
]
);

.

Nest的
Reflector
有一个内置方法,可以将控制器和路由处理程序上的元数据集与
getAllAndMerge
合并,这将合并类和方法中的元数据。要使用它,您可以执行以下操作

const roles=this.reflector.getAllAndMerge(
"角色",,
[
context.getHandler(),
context.getClass()
]
);
如果您只想获取一组元数据并有一个回退(例如,如果您只需要处理程序元数据(如果它存在),如果不获取类的元数据),则可以以类似的方式使用
getAllAndOverride

const roles=this.reflector.getAllAndOverride(
"角色",,
[
context.getHandler(),
context.getClass()
]
);