我有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/