[JAVA] Behebung eines Problems, das eine AlreadyBuiltException in Spring Security verursacht hat

Ich war ziemlich süchtig nach dem Problem, dass die Anwendung aufgrund von "AlreadyBuiltException" in Spring Security + Spring Boot nicht gestartet werden konnte, also das Lösungsprotokoll zu diesem Zeitpunkt.

Veranstaltung

Obwohl ich verschiedene Dinge weggelassen habe, habe ich die folgende Java-Konfiguration erstellt.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> auds;

    @Bean
    public PreAuthenticatedAuthenticationProvider preAuthenticationProvider() {
        PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
        provider.setPreAuthenticatedUserDetailsService(auds);
        return provider;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(preAuthenticationProvider()).build();
    }
}

Wenn Sie die Anwendung mit solchen Einstellungen starten, tritt der folgende Fehler auf.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.security.config.annotation.AlreadyBuiltException: This object has already been built

Ich habe eine Fehlermeldung erhalten, dass "springSecurityFilterChain" bereits erstellt wurde, aber ich habe eine Weile gebraucht, um die Ursache zu ermitteln.

Ursache

Dies lag daran, dass ich build mit der configure-Methode der SecurityConfig-Klasse ausführte. Es scheint, dass beim Ausführen des Builds "AuthenticationManager" generiert wird, aber tatsächlich wird es von der übergeordneten Klasse "WebSecurityConfigurerAdapter" ausgeführt. Es scheint, dass ein solches Problem aufgetreten ist, weil es dieses Mal zweimal ausgeführt wurde.

Sie können Folgendes tun.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> auds;

    @Bean
    public PreAuthenticatedAuthenticationProvider preAuthenticationProvider() {
        PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
        provider.setPreAuthenticatedUserDetailsService(auds);
        return provider;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(preAuthenticationProvider());
    }
}

Selbst wenn Sie die Dokumentation usw. überprüfen, haben Sie sie nicht mit JavaConfig erstellt. Aber es ist eine Builder-Klasse, und wenn die Build-Methode als Ergänzung herauskommt, möchten Sie sie erstellen!

Sie müssen das Dokument richtig lesen. Ich habe viel Zeit verschwendet.

Recommended Posts

Behebung eines Problems, das eine AlreadyBuiltException in Spring Security verursacht hat
Spring Security OAuth2 wird in einigen Jahren den Support beenden, eine Alternative