NestJS RolesGuard无法正常工作

时间:2019-09-14 04:41:33

标签: roles nestjs

我已经在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包含用户实例并被允许   角色。

我不明白这部分。该怎么做?

2 个答案:

答案 0 :(得分:0)

您的AuthGuard应该将用户附加到请求中。用户丢失会导致RoleGuard失败以及return语句中的第一个条件,从而不允许访问。 您能否显示auth实现以及如何将用户附加到请求? (对linking to my own comment感到抱歉,但只是准备了与Nest&护照相同的代码,您可能会发现它很有用)

答案 1 :(得分:0)

await必须在控制器级别。文档对此不太清楚。

一旦将RolesGuard移到使用RolesGuard的处理程序的控制器上,就可以了。