【问题标题】:StackOverflowError Trying to Expose AuthenticationManager in Spring WebSecurityConfigurerAdapterStackOverflowError 试图在 Spring WebSecurityConfigurerAdapter 中公开 AuthenticationManager
【发布时间】:2017-08-01 11:35:11
【问题描述】:

我试图通过扩展 WebSecurityConfigurerAdapter 来创建一个 Spring Security 配置,基本上是这样的:

@EnableWebSecurity
@Configuration
public class StackOverflowSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.authenticationProvider(myUsernamePasswordProvider());
        auth.authenticationProvider(mySecurityTokenProvider());

        super.configure(auth);
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    public MyPreAuthenticatedProcessingFilter myAuthenticationFilter() throws Exception {
        MyPreAuthenticatedProcessingFilter myAuthenticationFilter = new MyPreAuthenticatedProcessingFilter();
        myAuthenticationFilter.setAuthenticationManager(authenticationManager());

        return myAuthenticationFilter;
    }

}

我看到了这个:

SEVERE: Servlet.service() for servlet [servlet] in context with path [/MyApp] threw exception [Filter execution threw an exception] with root cause
[INFO] [talledLocalContainer] java.lang.StackOverflowError
[INFO] [talledLocalContainer]   at org.springframework.security.authentication.AnonymousAuthenticationProvider.supports(AnonymousAuthenticationProvider.java:79)
[INFO] [talledLocalContainer]   at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:164)
[INFO] [talledLocalContainer]   at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:469)
[INFO] [talledLocalContainer]   at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199)
[INFO] [talledLocalContainer]   at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:469)
[INFO] [talledLocalContainer]   at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199)
[INFO] [talledLocalContainer]   at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:469)
[INFO] [talledLocalContainer]   at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199)
[INFO] [talledLocalContainer]   at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:469)
[INFO] [talledLocalContainer]   at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199)
[INFO] [talledLocalContainer]   at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:469)
[INFO] [talledLocalContainer]   at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199)
...

我已尝试更改我能想到的所有方法以正确暴露 AuthenticationManager 而不会出现 StackOverflow 错误,但我仍然卡住了。我发现的唯一一件事是这个缺陷,https://github.com/spring-projects/spring-security/issues/2732,在 Spring Security 中,当“一个无效的配置试图在没有配置身份验证时将 AuthenticationManager 公开为 Bean”时,有人看到了同样的问题。不幸的是,我不知道这到底意味着什么或如何解决这个问题。

这个 Spring Security 配置在 Spring XML 配置中工作,这是我迁移到 Spring Java Config 的尝试。有没有更好的方法来配置我的 Spring Security 和/或将 AuthenticationManager 暴露给我的自定义身份验证过滤器?

【问题讨论】:

    标签: java spring spring-security filter spring-java-config


    【解决方案1】:

    当您配置具有相同实例的父身份验证提供程序时,也会发生此(类似症状)问题。即:

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                // next line can cause same stack overflow in case of non-existent user tries login.
                //.parentAuthenticationManager(authenticationManagerBean())
                .userDetailsService(customUserDetailsService)
                .passwordEncoder(passwordEncoder())
                .userDetailsPasswordManager(customUserDetailsService);
        super.configure(auth);
    }
    

    【讨论】:

      【解决方案2】:

      我终于弄清楚了这个问题。问题是我覆盖了错误的方法。我做到了:

      @Override
      @Bean
      public AuthenticationManager authenticationManager() throws Exception {
          return super.authenticationManagerBean();
      }
      

      代替:

      @Override
      @Bean
      public AuthenticationManager authenticationManagerBean() throws Exception {
          return super.authenticationManagerBean();
      }
      

      我最终覆盖了一个类似但不正确的方法。 authenticationManager() 方法用于对 AuthenticationManager 进行一些配置,authenticationManagerBean() 用于将 AuthenticationManager 公开为可以自动装配和使用的 Spring Bean。做我所做的会导致必要的配置不会发生,而是以导致堆栈溢出的方式链接 AuthenticationManager。

      【讨论】:

      • 在我的例子中,我有两个实现 UserDetailsS​​ervice 的类
      • 或者你可以通过在 authenticationManager() 方法中返回 super.authenticationManager 来做其他方式
      猜你喜欢
      • 2022-06-13
      • 2020-02-24
      • 2015-08-05
      • 2011-01-20
      • 2015-12-28
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多