javascript - 即时选择 AuthGuard 类型

标签 javascript node.js typescript nestjs

我的应用程序将使用两种不同的身份验证策略 - 一种针对使用浏览器的用户,另一种针对公共(public) API。我将为使用浏览器的用户设置一个 header,然后我的应用程序将根据该 header 的值设置身份验证策略。

我已经设置了两个身份验证策略,并为它们命名。我现在可以在我的 Controller 方法中执行此操作:

@Get()
@UseGuards(AuthGuard('strategy_name'))
async find() { }

我想做的是,不必在每个 Controller 方法旁边指定 auth guard 类型,也不必指定用于确定要使用哪种类型的逻辑。相反,我想将这个逻辑放在一个地方,所有对 AuthGuard() 的调用都会读取它。

执行此操作的最佳方法是什么? AuthGuard 是否有某种过滤器/ Hook /拦截器?

最佳答案

您可以创建一个新的 Guard 作为委托(delegate)并选择适当的 AuthGuard (以及 AuthStrategy)基于您的条件。

@Injectable()
export class MyAuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
    const guard = this.getAuthGuard(context);
    return guard.canActivate(context);
  }

  private getAuthGuard(context: ExecutionContext): IAuthGuard {
    const request = context.switchToHttp().getRequest();

    // Here should be your logic to determine the proper strategy.
    if (request.header('myCondition')) {
      return new (AuthGuard('jwt'))();
    } else {
      return new (AuthGuard('other-strategy'))();
    }
  }

然后在您的 Controller 中使用它代替标准的 AuthGuard:

@UseGuards(MyAuthGuard)
@Get('user')
getUser(@User() user) {
  return {user};
}

关于javascript - 即时选择 AuthGuard 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53361713/

相关文章:

javascript - 括号中的代码块在 JavaScript/jQuery 中意味着什么?

javascript - 从javascript变量分配一个php变量

node.js - Nodejs 读取文件 ENAMETOOLONG

javascript - 在 sails.js 应用程序中设置安全 cookie

javascript - 在 Ionic3 中订阅提供程序后,Console.log 显示为未定义

Typescript键值关系保留Object.entries类型

javascript - 如何使用 ReactJS 将输入值保存到文本文件?

javascript - datauri/图像到 Canvas

node.js - 如何使用静态方法扩展类?

javascript - 静态删除对象键 JavaScript