如何为 Nest.js 中的特定模块提供保护?

Mau*_*ipf 5 nestjs

我有一个名为的模块AdminModule,它应该受AdminGuard.

我尝试直接在模块中设置 Guard,如下所示:

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

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

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

Adr*_*tti 5

更新:实际上没有选择来实现这一点。

信息 :

你通过使用所做的APP_GUARD是在全球范围内应用它。它与 using 相同useGlobalGuards,但这种方式允许您利用 DI 系统。

{
  provide: APP_GUARD,
  useClass: AdminGuard,
},
Run Code Online (Sandbox Code Playgroud)

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

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

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

请参阅此处的文档:https : //docs.nestjs.com/guards

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

@UseGuards(RolesGuard)
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题的答案。问题想要将防护应用于**特定**模块,而不是公共模块或控制器。 (2认同)