即时选择AuthGuard类型

Dan*_*an. 2 javascript node.js typescript nestjs

我的应用程序将使用两种不同的身份验证策略 - 一种用于使用浏览器的用户,另一种用于公共 API.我将为header使用浏览器的用户设置一个,然后我的应用程序将根据其值设置auth策略header.

我已经设置了两个auth策略,并为它们命名.我现在可以在我的控制器方法中执行此操作:

@Get()
@UseGuards(AuthGuard('strategy_name'))
async find() { }
Run Code Online (Sandbox Code Playgroud)

我想做的是,不必在每个控制器方法旁边指定auth guard类型,也不必指定用于确定使用哪种类型的逻辑.相反,我想将这个逻辑放在一个地方,这将被所有调用读取AuthGuard().

最好的方法是什么?是否有某种过滤器/钩子/拦截器AuthGuard

Kim*_*ern 5

您可以创建一个新的Guard充当委托的人,AuthGuardAuthStrategy根据您的条件选择适当的(并随之).

@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'))();
    }
  }
Run Code Online (Sandbox Code Playgroud)

然后AuthGuard在控制器中使用它而不是标准:

@UseGuards(MyAuthGuard)
@Get('user')
getUser(@User() user) {
  return {user};
}
Run Code Online (Sandbox Code Playgroud)