首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Nest.JS中将服务注入到防护中

在Nest.JS中将服务注入到防护中
EN

Stack Overflow用户
提问于 2018-10-18 03:53:51
回答 3查看 16.6K关注 0票数 11

我有KeysModule,可以用来添加或删除API key。我需要这些密钥来保护一些路由,防止未经授权的访问。为了保护这些路由,我创建了ApiGuard:

代码语言:javascript
复制
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;
  }
}

然后我在路由中使用它:

代码语言:javascript
复制
 @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。这个解决方案是可行的,但是很愚蠢。我必须复制并粘贴一些代码行到我想要使用这个保护的地方(我指的是路由中的行)。

我试着把所有的逻辑都移到ApiGuard,但是我得到了错误,KeyService不能注入到ApiGuard类中。为了解释,我在KeysModule中使用了KeyService提供程序,但ApiGuard是全局使用的。

你知道怎么做吗?

EN

回答 3

Stack Overflow用户

发布于 2019-03-05 03:18:34

也许太晚了,但我运行了同样的问题并找到了解决方案。也许有一个更好的方法,但它对我来说工作正常:

将KeysModule定义为全局模块,可以在https://docs.nestjs.com/modules文档中查看如何实现

在您可以这样做之后:

代码语言:javascript
复制
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';

@Injectable()
export class ApiGuard implements CanActivate {

constructor(
@Inject('KeyService')
private readonly ks
) {}

const key = await this.ks.findKey();

"YOUR_CODE_HERE..."

}

希望这对你或将来坚持这样做的人有帮助。

票数 5
EN

Stack Overflow用户

发布于 2021-08-26 11:56:12

从NestJS v8开始,注入zsoca在公认答案中回答的服务似乎不再起作用。

NestJS 8的工作解决方案是通过提供类引用而不是字符串:

代码语言:javascript
复制
  constructor(@Inject(KeyService) private keyService: KeyService) {}
票数 3
EN

Stack Overflow用户

发布于 2021-02-25 01:35:09

卫士中使用的服务必须在其模块中导出。仅仅提供服务是不够的!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52862644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档