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?
您可以创建一个新的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'))();
}
}
Run Code Online (Sandbox Code Playgroud)
然后AuthGuard在控制器中使用它而不是标准:
@UseGuards(MyAuthGuard)
@Get('user')
getUser(@User() user) {
return {user};
}
Run Code Online (Sandbox Code Playgroud)