2017-03-11 6 views
-1

봄 WebSecurityConfigurerAdapter에서의 AuthenticationManager를 노출하려고 :에 유래 나는 기본적으로 같은 WebSecurityConfigurerAdapter을 확장하여 봄 보안 구성을 만들려고하고

@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이며, "인증이 구성되지 않은 경우 AuthenticationManager를 Bean으로 노출하려고 시도하는 잘못된 구성"이있을 때 누군가가이 동일한 문제점을 보았던 Spring Security가 있습니다. 불행히도 나는 그것이 정확히 무엇을 의미하는지 또는이 문제를 어떻게 해결할 지 모릅니다.

이 스프링 시큐리티 설정은 스프링 XML 설정에서 작동하며 이는 스프링 자바 설정으로 마이그레이션하려는 시도이다. Spring Security를 ​​구성하고 AuthenticationManager를 사용자 정의 인증 필터에 노출시키는 더 좋은 방법이 있습니까?

답변

2

마침내 문제가 발생했습니다. 문제는 내가 잘못된 방법을 무효화했다는 것입니다. 내가 그랬어 :

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

대신에 :

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

나는 비슷하지만 잘못된 메서드를 재정 끝났다. authenticationManager() 메서드는 AuthenticationManager에 대한 일부 구성을 수행하는 데 사용되며은 AuthenticationManager를 Autowired가 될 수있는 Spring Bean으로 노출시키는 데 사용됩니다. 내가 한 일을 수행하면 필요한 구성이 발생하지 않고 대신 AuthenticationManagers가 스택 오버플로를 유발하는 방식으로 연결됩니다.