即时选择AuthGuard类型

时间:2018-11-18 14:01:05

标签: javascript node.js typescript nestjs

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

我已经设置了两种身份验证策略,并为其指定了名称。我现在可以在控制器方法中做到这一点:

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

我想做的是,不必在每个控制器方法旁边指定身份验证保护类型,也不必确定使用哪种类型的逻辑。相反,我想将此逻辑放在一个地方,所有对AuthGuard()的调用都会读取该逻辑。

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

1 个答案:

答案 0 :(得分:5)

您可以创建一个新的Guard作为委托并选择适当的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'))();
    }
  }

然后使用它代替控制器中的标准AuthGuard

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