【问题标题】:Nest.js Global guardNest.js 全局守卫
【发布时间】: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))

或者有更好的方法吗?

【问题讨论】:

    标签: node.js dependency-injection global guard


    【解决方案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 {}
        

        【讨论】:

          猜你喜欢
          • 2022-08-11
          • 1970-01-01
          • 1970-01-01
          • 2017-11-27
          • 2013-03-31
          • 1970-01-01
          • 2018-08-31
          • 2011-12-22
          相关资源
          最近更新 更多