복붙노트

[SPRING] 모든 프로 바이더의 후에 Spring Security java.lang.StackOverflowError 예외

SPRING

모든 프로 바이더의 후에 Spring Security java.lang.StackOverflowError 예외

환경:

필자는 ActiveDirectory를 타격하는 인증 공급자 2 개와 내가 만든 사용자 지정 데이터베이스 공급자를 공격하는 인증 공급자를 가지고 있습니다. 이러한 환경 중 하나에있는 사용자로 로그인하면 완벽하게 작동합니다. 사용자가 인증되고 앱이 계속됩니다.

그러나 잘못된 사용자가 입력되고 어느 공급자도 인증 할 수 없으면 페이지에서 다음 예외가 발생합니다.

java.lang.StackOverflowError
    org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:393)
    org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:394)
    org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:394)
    org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:394)

다음은 WebSecurityConfigurerAdapter 구성입니다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .formLogin().loginPage("/login").failureUrl("/login?error").defaultSuccessUrl("/overview").permitAll()
            .and()
                .logout().logoutSuccessUrl("/login?logout").permitAll()
            .and()
                .authorizeRequests()
                .antMatchers("/resources/**").permitAll()
                .antMatchers("/favicon.ico").permitAll()
                .antMatchers("/**").hasRole("AUTH");
}

@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
    authManagerBuilder
            .authenticationProvider(activeDirectoryLdapAuthenticationProvider())
            .userDetailsService(userDetailsService());

    authManagerBuilder
            .authenticationProvider(databaseAuthenticationProvider())
            .userDetailsService(userDetailsService());
}

@Bean
public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
    ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(DOMAIN, URL);
    provider.setConvertSubErrorCodesToExceptions(true);
    provider.setUseAuthenticationRequestCredentials(true);
    provider.setUserDetailsContextMapper(userDetailsContextMapper());
    return provider;
}

@Bean
public UserDetailsContextMapper userDetailsContextMapper() {
    UserDetailsContextMapper contextMapper = new MyUserDetailsContextMapper();
    return contextMapper;
}

@Bean
public MyDatabaseAuthenticationProvider databaseAuthenticationProvider() {
    return new MyDatabaseAuthenticationProvider();
}

"MyDatabaseAuthenticationProvider"또는 "MyUserDetailsContextMapper"클래스에는 사용자를 매핑하고 찾는 데 필요한 몇 가지 사용자 지정 논리를 제외하고는 특별한 것이 없습니다.

앱이 다운되지는 않지만 분명히 사용자에게 보여주고 싶은 페이지가 아닙니다. :)

StackOverflowError 제거 방법에 대한 생각은?

해결법

  1. ==============================

    1.나는 똑같은 문제가 있었는데, 이것이 나를위한 해결책이었다.

    나는 똑같은 문제가 있었는데, 이것이 나를위한 해결책이었다.

    @Override
    protected void configure(AuthenticationManagerBuilder
    authManagerBuilder) throws Exception {
    ...
    .userDetailsService(userDetailsService());
    ...
    }
    

    userDetailsService 다음에 괄호가있는 문제는이를 제거하고 예상대로 작동합니다. 코드 스 니펫에서 userDetailsService를 어디에서 가져올 지 확신 할 수 없지만 나를 위해 @Autowired가 있습니다.

  2. from https://stackoverflow.com/questions/30766106/spring-security-java-lang-stackoverflowerror-exception-after-all-providers by cc-by-sa and MIT license