【问题标题】:NestJS - How to use RoleGuard with JWT?NestJS - 如何将 RoleGuard 与 JWT 一起使用?
【发布时间】:2019-04-02 13:58:07
【问题描述】:

目前,我已经设法将 AuthGuard 与 JWT 身份验证一起使用,但我无法在 Roles 上获得 user

我尝试关注 example 的猫,但我从未定义过 user 对象,您可以在第 14 行看到。

这是我的代码:

// auth.controller.ts
@Controller('auth')
@UseGuards(RolesGuard)
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @Get('token')
  async createToken(): Promise<any> {
    return await this.authService.createToken();
  }

  @Post()
  @UseGuards(AuthGuard())
  @Roles('admin')
  findAll() {
    // this route is restricted by AuthGuard
    // JWT strategy
    return 'Super important info';
  }
}


// auth.module.ts
@Module({
  imports: [
    SharedModule,
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.registerAsync({
      imports: [SharedModule],
      useFactory: async (configService: ConfigService) => ({
        secretOrPrivateKey: configService.get('SECRET_KEY'),
        signOptions: {
          expiresIn: configService.get('SECRET_KEY_EXPIRES'),
        },
      }),
      inject: [ConfigService],
    }),
  ],
  controllers: [AuthController],
  providers: [
    AuthService,
    JwtStrategy,
  ],
})
export class AuthModule {}

所有其余部分与存储库中的示例完全相同。知道如何定义 users 吗?

【问题讨论】:

    标签: javascript node.js typescript nestjs


    【解决方案1】:

    AuthGuard() 必须在 RolesGuard 之前运行,以便您通过身份验证并设置 user 属性。

    据我所知,除了将它们定义为之外,没有其他方法可以更改守卫的顺序:

    @UseGuards(AuthGuard(), RolesGuard)
    

    issue 中讨论了用于更改守卫执行层次结构的潜在 API。


    issue 提到了另一种解决方案:

    对于这个用例,我觉得将身份验证逻辑放在中间件中会更好,因为它在警卫之前运行。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 2020-08-10
      • 2012-03-06
      • 2022-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2015-07-18
      • 2020-09-02
      相关资源
      最近更新 更多