我的应用将使用两种不同的身份验证策略-一种用于使用浏览器的用户,另一种用于 public API。我将为使用浏览器的用户设置一个header
,然后我的应用将根据该header
的值设置身份验证策略。
我已经设置了两种身份验证策略,并为其指定了名称。我现在可以在控制器方法中做到这一点:
@Get()
@UseGuards(AuthGuard('strategy_name'))
async find() { }
我想做的是,不必在每个控制器方法旁边指定身份验证保护类型,也不必确定使用哪种类型的逻辑。相反,我想将此逻辑放在一个地方,所有对AuthGuard()
的调用都会读取该逻辑。
执行此操作的最佳方法是什么? AuthGuard
是否有某种过滤器/挂钩/拦截器?
答案 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};
}