Nest JS Guards — используйте одну из двух стратегий

В моем приложении есть две стратегии на основе 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 метода.


Другой вариант, который я нашел, заключался в том, чтобы наследовать одну стратегию от другой. . Но это уродливая семантическая каша, поскольку они параллельны и совершенно не зависят друг от друга.


person Alex Wayne    schedule 26.01.2021    source источник


Ответы (1)


В соответствии с этим запросом на включение вы можете использовать @UseGuards(AuthGuard(['strategy1', 'strategy2'])) паспорт, который будет проходить через первая стратегия, если она не удалась, она будет проходить через стратегию 2, вплоть до стратегии N. Если при запуске стратегии возникает ошибка, она быстро выйдет из строя.

person Jay McDoniel    schedule 26.01.2021