我有KeysModule,可用于添加或删除API key 。我需要这些 key 来保护某些路由免遭未经授权的访问。
为了保护这些路线,我创建了ApiGuard:

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';

@Injectable()
export class ApiGuard implements CanActivate {

async canActivate(
    context: ExecutionContext,
  ): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    return request.headers.api_key;
  }
}

然后我在路由中使用它:
 @Get('/protected')
 @UseGuards(ApiGuard)
 async protected(@Headers() headers: Api) {
   const key = await this.ks.findKey({ key: headers.api_key });
   if (!key || !key.active) return 'Invalid Key';
   return 'Your API key works';
 }

其中ks是KeyService,用于检查 key 是否正确。
此解决方案有效,但很愚蠢。我必须在要使用此防护的所有位置复制并粘贴一些代码行(我的意思是路由中的行)。

我试图将所有逻辑移至ApiGuard,但出现错误,无法将KeyService注入(inject)ApiGuard类。解释一下,我在KeysModule的提供程序中有KeyService,但是ApiGuard在全局范围内使用。

你有什么想法吗?

最佳答案

要在卫队中注入(inject)服务。您可以创建一个全局模块。

// ApiModule
import {Module,Global} from '@nestjs/common';
import {KeyService} from '../';

@Global()
@Module({
    providers: [ KeyService ],
    exports: [KeyService]
})
export class ApiModule {}

然后像这样将服务注入(inject) guard
// guard
export class ApiGuard implements CanActivate {
constructor(@Inject('KeyService') private readonly KeyService) {}
}
 async canActivate(context: ExecutionContext) {
    // your code
    throw new ForbiddenException();
  }

现在可以解决问题了,但是我还有另一个问题,我想向服务中注入(inject)一些东西,但是出现了这个错误:



这是我的解决方案:

要在KeyService中注入(inject)其他依赖项,例如nestjs docs这样。



这是他们的样本:
// app.module.js
import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: RolesGuard,
    },
  ],
})
export class ApplicationModule {}

它起作用了。现在我可以使用全局保护而没有依赖错误了。

关于node.js - 将服务注入(inject)Nest.JS中的守护程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52862644/

10-16 13:01