Hra*_*yan 5 dependency-injection guard nestjs
我是 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));
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想像这样使用这个守卫作为全局守卫
app.useGlobalGuards(new RolesGuard())
Run Code Online (Sandbox Code Playgroud)
但它说我需要将参数(反射器)传递给警卫,正如我在构造函数中提到的那样,现在可以像这样初始化反射器吗?
const reflector:Reflector = new Reflector();
app.useGlobalGuards(new RolesGuard(reflector))
Run Code Online (Sandbox Code Playgroud)
或者有更好的方法来做到这一点吗?
小智 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 {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7146 次 |
| 最近记录: |