我的应用程序将使用两种不同的身份验证策略 - 一种针对使用浏览器的用户,另一种针对公共(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/