我没有在 Roles.guard.ts const { user } = context.switchToHttp().getRequest(); 中获取此字符串中的 user 用户未定义,但是当我删除其他代码并仅保留此代码时:
canActivate(context: ExecutionContext): boolean {
const { user } = context.switchToHttp().getRequest();
colnsole.log(user)//user is exist
return true
}
}
和 console.log 我得到了用户,我不知道我应该做什么。我从文档中获取的代码。
代码: 角色.guard.ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
@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();//user doesnt exist
return requiredRoles.some((role) => user.roles?.includes(role));
}
}
roles.enum.ts
export enum Role {
User = 'User',
Admin = 'Admin'
}
app.module.ts
@Module({
imports: [
ConfigModule.forRoot(),
AuthModule,
UserModule,
ProductModule,
ReviewModule,
OrderModule,
CategoryModule
],
controllers: [AppController],
providers: [
AppService,
PrismaService,
{
provide: APP_GUARD,
useClass: RolesGuard
}
]
})
export class AppModule {}
更有可能的是,您的
RolesGuard
,正如您在全局设置的那样,在您拥有的任何身份验证防护之前运行,因此将无法读取身份验证防护正在执行的任何操作。如果您计划保持 RolesGuard
全局,您可以而且可能应该将身份验证保护设置为全局,并向您想要跳过用户身份验证的路由添加一些元数据,以便它可以首先运行并让 RolesGuard
运行第二个