Я добавляю Spring SAML в некоторые программы, которые до сих пор использовали только OAuth2. Мне нужно убедиться, что OAuth все еще работает, поскольку SAML доступен только для некоторых наших клиентов.
Я столкнулся с проблемой, когда старый oAuth, похоже, больше не работает (хотя SAML в основном в порядке). Кажется, что диспетчер аутентификации как-то перезаписывается, но не понятно, как и почему. Вот соответствующий код в моем WebSecurityConfig.java:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService)
.passwordEncoder(passwordService.getEncoder())
.and()
.authenticationProvider(samlAuthenticationProvider)
.authenticationProvider(oAuth2AuthenticationProvider());
}
И SAMLConfig.java:
@Bean
public SAMLProcessingFilter samlWebSSOProcessingFilter() throws Exception {
SAMLProcessingFilter samlWebSSOProcessingFilter = new SAMLProcessingFilter();
samlWebSSOProcessingFilter.setAuthenticationManager(authenticationManager());
samlWebSSOProcessingFilter.setAuthenticationSuccessHandler(successRedirectHandler());
samlWebSSOProcessingFilter.setAuthenticationFailureHandler(authenticationFailureHandler());
return samlWebSSOProcessingFilter;
}
@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(Collections.singletonList(samlAuthenticationProvider()));
}
Очевидно, что это неправильно, но неясно, как это исправить.
Когда я отлаживаю, AuthenticationManagerBuilder.performBuild () вызывается три раза при запуске.
- Первый сборка с использованием SAML, OAuth2 и Dao AuthenticationProviders.
- Второй создает один с AnonymousAuthenticationProvider.
- Третий создает один с другим DaoAuthenticationProvider.
При входе в систему ProviderManager.authenticate () вызывается дважды.
- В первый раз у него есть только один поставщик - AnonymousAuthenticationProvider. Это не подтверждает подлинность.
- Второй раз - родительский менеджер в первый раз. У него только один поставщик SAMLAuthenticationProvider. Если пользователь, с которым я аутентифицируюсь, не найден в SAML, это все еще последний вызываемый провайдер или менеджер.
Почему? Как исправить это, чтобы я мог перенаправить учетные данные в SAML в некоторых случаях и OAuth во всех других случаях или разрешить переполнение любых учетных данных, которые не работают в SAML, в OAuth?