#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
в вашем приложении.