В моем приложении есть две стратегии на основе JWT:
- Единый вход для моей организации и ее участников. Внешний провайдер создает для этого случая JWT.
- Внешние пользователи, прошедшие проверку подлинности по электронной почте/паролю. Мое приложение создает JWT для этого случая.
На любом заданном маршруте мне нужен только один из них, чтобы разрешить доступ. Проблема в том, что если объявлено несколько охранников, то ВСЕ охранники должны сработать.
Например, для этого потребуется, чтобы оба охранника преуспели, но только один из них когда-либо преуспеет.
@UseGuards(AuthGuard('local-jwt'))
@UseGuards(AuthGuard('azure-ad'))
someRoute(
@CurrentUser currentUser: User,
) {
//...
}
В этой проблеме я нашел этот фрагмент:
@Injectable()
export class ComposeGuard implements CanActivate {
constructor(private allowGuard: AllowGuard, private authGuard: AuthGuard, private roleGuard: RoleGuard) {
}
async canActivate(context: ExecutionContext): Promise<boolean> {
return await this.allowGuard.canActivate(context) || (await this.authGuard.canActivate(context) && await this.roleGuard.canActivate(context));
}
}
Кажется, это позволяет использовать пользовательскую логику, которая мне нужна, но я понятия не имею, как импортировать охранники в качестве зависимостей. Охранник, похоже, не является классом, поэтому он подходит для внедрения зависимостей. А стратегия — это класс, но не имеет canActivate
метода.
Другой вариант, который я нашел, заключался в том, чтобы наследовать одну стратегию от другой. . Но это уродливая семантическая каша, поскольку они параллельны и совершенно не зависят друг от друга.