Как настроить несколько менеджеров аутентификации в зависимости от входящего URL-адреса для сервера авторизации?

#spring-security #spring-oauth2

Вопрос:

С Пружинной Защитой

В устаревшем проекте для сценария предоставления пароля мне нужно настроить сервер авторизации.

В настоящее время он расширен AuthorizationServerConfigurerAdapter , и конечные точки авторизации настроены с переопределением configure(AuthorizationEndpointsServerConfigurer) метода.

Моя проблема заключается в том, что этот конфигуратор занимает одно AuthenticationManager пароль Грант, когда мне понадобится что-то вроде AuthenticationManagerResolver (но я не могу обновить до 5,2) уметь применять различные проверки подлинности в зависимости от входящего URL-адреса (аутентификации менеджер для админа URL-адреса, например «/админ/**», и еще один для администратора).

Как я могу это сделать? Я могу изменить подход, но опять же я не могу обновить.

Ответ №1:

Вы можете попробовать реализовать свое собственное делегирование AuthenticationManager , ввести в него список ваших AuthenticationManager s и ввести свою логику в authenticate метод. Например:

 @Component("delegatingAM") public class DelegatingAuthenticationManager implements AuthenticationManager {  private final Listlt;AuthenticationManagergt; ams;   @Autowire  public DelegatingAuthenticationManager(@Qualifier("x") AuthenticationManager amX, @Qualifier("y") AuthenticationManager amY) {  this.ams = List.of(amX, amY); // Arrays.asList(amX, amY);  // you can inject variables for your conditions here   }   @Override  public Authentication authenticate(Authentication authentication) throws AuthenticationException {  if (...) this.ams.get(0).authenticate(authentication);  if (...) this.ams.get(0).authenticate(authentication);  // Or you can loop over the list like AuthenticationManager is implemented with AuthenticatioProvider  } }  

Затем впрысните его в AuthorizationServerConfigurerAdapter

 @Configuration @EnableAuthorizationServer public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {  @Autowired  @Qualifier("delegatingAM")  private AuthenticationManager authenticationManager;    @Override  public void configure(AuthorizationServerEndpointsConfigurer endpoints) {  endpoints  .authenticationManager(this.authenticationManager)  }  ... }  

Надеюсь, это поможет, в худшем случае вы могли бы начать думать об использовании многих серверов авторизации SecurityFilterChain , по одному AuthenticationManager для каждого. И, основываясь на URL-адресе, направьте запрос вправо SecurityFilterChain .

Комментарии:

1. Привет, спасибо за ваше время, как бы вы получили доступ к запросу, чтобы иметь возможность написать условие if для выбора правильного менеджера?

2. А что касается другого решения, о котором вы упомянули, не могли бы вы привести пример? 🙂

3. Извините, я забыл самую важную часть, что условия указаны в запросе. О втором способе, в идеале, он лучше всего подходит для вашего случая в соответствии с теорией безопасности spring, но я не пробовал этого раньше, у меня было только по 3 SecurityFilterChain s для Basic, Oauth, Saml2, когда я занимался этим устаревшим проектом в прошлом вместо 2 Oauth в вашем случае. Еще раз прошу прощения. Надеюсь, кто-нибудь еще сможет вам помочь, удачи!

4. Было бы здорово , если бы вы могли изменить предопределенное AuthorizationServerSecurityConfiguration или найти что-то для настройки HttpSecurity#requestMatchers , это ключ для создания 2 или более SecurityFilterChain в вашем приложении.