为什么Spring SAML会阻止Spring OAuth2工作?

时间:2018-05-02 06:03:30

标签: java spring spring-security spring-security-oauth2 spring-saml

我将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导向OAuth,还是允许任何在SAML中无效的凭据溢出到OAuth?

1 个答案:

答案 0 :(得分:0)

imag创建一个跳过构建器进程的AuthenticationManager,这就是调试new ProviderManager()时不显示的原因。

performBuild() bean方法旨在返回现有的全局AuthenticationManager,但问题使用它的方式将返回一个新的不同的AuthenticationManager,覆盖构建器返回的内容。这就是调试authenticationManager() 出现的原因,而构建的AuthenticationManager则没有。

解决方案是将现有的AuthenticationManager传递给authenticate(),而不是新的。我这样做的方法是将所有代码从SAMLConfig.java移动到WebSecurityConfig.java,这更简单,但这不是唯一的方法。

相关问题