Почему Spring SAML препятствует работе Spring OAuth2? - PullRequest
0 голосов
/ 02 мая 2018

Я добавляю 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?

1 Ответ

0 голосов
/ 03 мая 2018

new ProviderManager() создает AuthenticationManager, который пропускает процесс построения, поэтому он не отображается при отладке performBuild().

Метод бина authenticationManager() предназначен для возврата существующего глобального AuthenticationManager, но способ, которым его использует вопрос, вместо этого возвращает новый и другой AuthenticationManager, перезаписывая то, что возвращает построитель. Вот почему он отображается при отладке authenticate(), а встроенный AuthenticationManager - нет.

Решение состоит в том, чтобы передать существующий AuthenticationManager в SAMLProcessingFilter.setAuthenticationManager(), а не новый. Я сделал это, переместив весь код из SAMLConfig.java в WebSecurityConfig.java, что было более простым, но это не единственный способ сделать это.

...