我已经在NestJS官方文档的帮助下实现了RoleGuard的实现。
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private readonly reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const roles = this.reflector.get<string[]>('roles', context.getHandler());
if (!roles) {
return true;
}
const request = context.switchToHttp().getRequest();
const user = request.user;
//console.log(request)
const hasRole = () => user.role.some((role) => roles.includes(role));
return user && user.roles && hasRole();
}
}
并应用如下
@Get('get/all')
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles('user')
async findAll(): Promise<Service[]> {
return this.serviceServce.findAll()
}
这是我的身份验证策略
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
async validate(payload: any) {
console.log(JSON.stringify(payload));
return { userId: payload.sub, username: payload.username };
}
}
这也是我的身份验证服务
async login(user: any) {
const payload = { email: user.email, sub: user.Id };
return {
access_token: this.jwtService.sign(payload),
};
}
但它总是返回
{
"statusCode": 403,
"error": "Forbidden",
"message": "Forbidden resource"
}
我调试请求,并且用户为空(request.user) 在说明文件中
在node.js世界中,通常的做法是附加授权 用户到请求对象。因此,在上面的示例代码中, 假设request.user包含用户实例并被允许 角色。
我不明白这部分。该怎么做?
答案 0 :(得分:0)
您的AuthGuard
应该将用户附加到请求中。用户丢失会导致RoleGuard失败以及return语句中的第一个条件,从而不允许访问。
您能否显示auth实现以及如何将用户附加到请求?
(对linking to my own comment感到抱歉,但只是准备了与Nest&护照相同的代码,您可能会发现它很有用)
答案 1 :(得分:0)
await
必须在控制器级别。文档对此不太清楚。
一旦将RolesGuard
移到使用RolesGuard
的处理程序的控制器上,就可以了。