【问题标题】:How to provide a Guard for a specific Module in Nest.js?如何为 Nest.js 中的特定模块提供 Guard?
【发布时间】:2022-04-19 23:41:46
【问题描述】:

我有一个名为AdminModule 的模块,它应该受到AdminGuard 的保护。

我尝试像这样在模块中直接设置Guard:

@Module({
  imports: [
    HttpModule,
  ],
  controllers: [AdminController],
  providers: [
    {
      provide: APP_GUARD,
      useClass: AdminGuard,
    },
    AdminService,
  ],
})
export class AdminModule {
}

但是,守卫不限于此模块,而是全局的(如文档中所述:"the guard is, in fact, global")。

但是怎么可能让守卫只保护一个模块呢?

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    更新:实际上没有办法实现这一点。

    信息:

    您使用APP_GUARD 所做的就是将其应用于全局。这与使用useGlobalGuards 相同,但这种方式可以让您利用 DI 系统。

    {
      provide: APP_GUARD,
      useClass: AdminGuard,
    },
    

    如果您不想全局应用它,请不要将其添加到模块中提供程序的数组中。

    相反,只需像这样创建一个新的守卫

    @Injectable()
    export class RolesGuard implements CanActivate {
      canActivate(
        context: ExecutionContext,
      ): boolean | Promise<boolean> | Observable<boolean> {
        return true;
      }
    }
    

    在此处查看文档:https://docs.nestjs.com/guards

    然后在类级别将其应用于您的控制器,以影响控制器的所有处理程序,或应用于影响特定端点的方法。

    @UseGuards(RolesGuard)
    

    【讨论】:

    • 这不是问题的答案。问题想对 specific 模块应用保护,而不是公共或控制器。
    • 是的,答案是 1.5 年前,当时不可能。但我认为这仍然不可能
    • 我认为你应该用最上面的总结来更新答案:“没有办法申请......”
    • 好的,我已经更新了,我敢肯定,如果在 2 年内可能会有人说答案是错误的,即使是几年前的答案。其他答案已经发生在我身上了啊哈
    • 在使用特定模块方面是否有任何更新?
    【解决方案2】:

    你可以在控制器类前加上@UseGuards(JwtAuthGuard),让守卫保护控制器上的所有路由。

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 1970-01-01
      • 2023-04-04
      • 2019-08-14
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      相关资源
      最近更新 更多