SetMetadata 更改守卫执行顺序 nestjs
SetMetadata changes guard execution order nestjs
当我包含 @Permissions('read')
我的 acessGuard 停止接收 JWT 信息时,@Permissions
只是设置元数据(下面的代码)
export const Permissions = (...permissions: string[]) => SetMetadata('permissions', permissions);
certificate.controller.ts:
@UseGuards(LocalAuthGuard, AccessGuard)
@Controller('certificate')
export class CertificateController {
constructor(private certificateService: CertificateService) {}
@Get()
@Permissions('read') // removing this req.user is filled with jwt data
async getCertificates(@CurrentUser() user: User) {
return this.certificateService.getCertificates(user.id);
}
Bellow 是一个守卫,它将控制用户是否有权执行该操作
export class AccessGuard implements CanActivate {
constructor(
private readonly accessService: AccessService,
@Inject('Reflector') private readonly reflector: Reflector,
) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const permissions = this.reflector.get<enAccessPoliciesModules[]>(
'permissions',
context.getHandler(),
);
console.log(context.switchToHttp().getRequest().user); // when i include @Permission('read') this line is undefined
}
}
估计跟执行顺序有关系,一开始是
LocalAuthGuard -> AccessGuard
但是在设置元数据之后它变成了 AccessGuard -> LocalAuthGuard
,这样 request.user 是未定义的。
有什么解决方法吗?
我发现了问题
@Module({
imports: [CoreModule, AuthModule, AccessPoliciesModule, CertificateModule],
controllers: [AppController],
providers: [
AppService,
{ provide: APP_GUARD, useClass: AccessPoliciesGuard },
],
})
export class AppModule {}
因为我试图修复依赖性错误,所以我在 appModule 提供程序中添加了 APP_GUARD。我意识到守卫被执行了 2 次,第一次它没有令牌,因为它是全球守卫,我想我有优先权?
当我包含 @Permissions('read')
我的 acessGuard 停止接收 JWT 信息时,@Permissions
只是设置元数据(下面的代码)
export const Permissions = (...permissions: string[]) => SetMetadata('permissions', permissions);
certificate.controller.ts:
@UseGuards(LocalAuthGuard, AccessGuard)
@Controller('certificate')
export class CertificateController {
constructor(private certificateService: CertificateService) {}
@Get()
@Permissions('read') // removing this req.user is filled with jwt data
async getCertificates(@CurrentUser() user: User) {
return this.certificateService.getCertificates(user.id);
}
Bellow 是一个守卫,它将控制用户是否有权执行该操作
export class AccessGuard implements CanActivate {
constructor(
private readonly accessService: AccessService,
@Inject('Reflector') private readonly reflector: Reflector,
) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const permissions = this.reflector.get<enAccessPoliciesModules[]>(
'permissions',
context.getHandler(),
);
console.log(context.switchToHttp().getRequest().user); // when i include @Permission('read') this line is undefined
}
}
估计跟执行顺序有关系,一开始是
LocalAuthGuard -> AccessGuard
但是在设置元数据之后它变成了 AccessGuard -> LocalAuthGuard
,这样 request.user 是未定义的。
有什么解决方法吗?
我发现了问题
@Module({
imports: [CoreModule, AuthModule, AccessPoliciesModule, CertificateModule],
controllers: [AppController],
providers: [
AppService,
{ provide: APP_GUARD, useClass: AccessPoliciesGuard },
],
})
export class AppModule {}
因为我试图修复依赖性错误,所以我在 appModule 提供程序中添加了 APP_GUARD。我意识到守卫被执行了 2 次,第一次它没有令牌,因为它是全球守卫,我想我有优先权?