Nest.js 全局守卫
Posted
技术标签:
【中文标题】Nest.js 全局守卫【英文标题】:Nest.js Global guard 【发布时间】:2020-08-03 07:24:02 【问题描述】:我是nest.js 的新手,我有一个问题。 我有这样的角色守卫
import CanActivate, ExecutionContext, Injectable from '@nestjs/common';
import Observable from 'rxjs';
import Reflector from '@nestjs/core';
@Injectable()
export class RolesGuard implements CanActivate
constructor(private readonly reflector: Reflector)
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean>
const roles = this.reflector.get<string[]>('roles', context.getHandler());
if (!roles)
return true;
const request = context.switchToHttp().getRequest();
const user = request.user;
return user.role.some(role => !!roles.find(item => item === role));
现在我想把这个守卫用作这样的全局守卫
app.useGlobalGuards(new RolesGuard())
但是它说我需要将参数(反射器)传递给我在构造函数中提到的守卫,现在可以像这样初始化反射器了吗?
const reflector:Reflector = new Reflector();
app.useGlobalGuards(new RolesGuard(reflector))
或者有更好的方法吗?
【问题讨论】:
【参考方案1】: app.useGlobalGuards(new RolesGuard(new Reflector()));
它也在工作。找不到更好的解决方案。
【讨论】:
【参考方案2】:虽然我的回答可能不会增加太多价值,但我只想重申这是获得反射器的预期方式,这是来自 NestJS 的创建者的引述
kamilmysliwiec
当你手动创建实例时,你可以通过 你自己:
new RoleGuard(new Reflector());
来源:https://github.com/nestjs/nest/issues/396#issuecomment-363111707
【讨论】:
【参考方案3】:在官方 Nest JS 基础课程中,在讲座“54 Protect Routes with Guards”中,讲师指定自己创建反射器实例不是最佳实践。
解决依赖关系的更好方法是创建一个公共模块,并在那里注册你的守卫。这样,反射器实例由嵌套运行时解析,您还可以为任何其他依赖项指定导入数组。
import Module from '@nestjs/common';
import APP_GUARD from '@nestjs/core';
import AuthTokenGuard from './guards/auth-token.guard';
import ConfigModule from '@nestjs/config';
@Module(
imports: [ConfigModule],
providers: [
provide: APP_GUARD,
useClass: AuthTokenGuard,
,
],
)
export class CommonModule
【讨论】:
以上是关于Nest.js 全局守卫的主要内容,如果未能解决你的问题,请参考以下文章