javascript - NestJS - 如何将 RoleGuard 与 JWT 结合使用?

标签 javascript node.js typescript nestjs

目前,我已成功将 AuthGuard 与 JWT 身份验证结合使用,但无法在 Angular 色上获取用户

我尝试过跟随猫 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 {}

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

最佳答案

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

据我所知,除了将它们定义为:

之外,没有其他方法可以更改守卫的顺序
@UseGuards(AuthGuard(), RolesGuard)

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

<小时/>

这个issue提到了替代解决方案:

for this use case, i feel like putting authentication logic in a middleware would be better, as it runs before the guard.

关于javascript - NestJS - 如何将 RoleGuard 与 JWT 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55476665/

相关文章:

javascript - JavaScript 轮播的多个实例

javascript - REACT 删除对象数组中的元素

javascript - 通过 Node js 将来自 python flask 的响应转发给客户端

javascript - Child_process 处理带有回车 (\r) 的 STDOUT 流

node.js - Express 3 session 总是落后一个请求

angular - 尽管应用程序按预期运行,但无法读取未定义错误的属性

javascript - 如何比较具有不同字段的 2 个不同对象,并使用告诉共同元素的新字段创建一个新对象

javascript - 在外部页面上运行 jQuery/调试 jQuery

javascript - 自动提交下拉值到数据库中

javascript - 使用 forRoot 依赖于模块的 Angular 传递服务