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.
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.
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.