2016-08-02 15 views
1

Ich starte meine Spring Boot-Anwendung von SpringBootServletInitializer-Klasse, weil ich es als WAR-Datei bereitstellen möchten. Ich weiß nicht, wie ich Sicherheit aktivieren kann.Wie konfiguriert man Spring Boot als .war-Datei zusammen mit Sicherheit?

public class ApplicationInitializer extends SpringBootServletInitializer { 

    private static final Object[] configurations = { 
      SecurityConfiguration.class, 
      ApplicationInitializer.class 
    }; 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(configurations); 
    } 
} 

wo SecurityConfiguration wie folgt lautet:

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{ 

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

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     /******/ 
    } 
} 

Mit dieser Konfiguration ich AlreadyBuiltException:

'springSecurityFilterChain' threw exception; nested exception is org.springframework.security.config.annotation.AlreadyBuiltException: This object has already been built 
+0

Versuchen zu konfigurieren, dass nur die aktuelle Klasse in 'application.sources()' Beispiel laden 'return application.sources (ApplicationInitializer.class);' 'SecurityConfiguration' wird durchsucht, wenn die Anwendung korrekt strukturiert ist. –

+0

SecurityConfiguration befindet sich im selben Paket wie ApplicationInitializer. Aber wenn ich nur ApplicationInitializer lade, befindet sich die Spring-Sicherheit immer noch im Standardmodus (Basis-Auth mit einem Benutzer und zufällig generiertem Passwort in der Konsole) –

+0

Haben Sie '@ SpringBootApplication' auf' ApplicationInitializer'? –

Antwort

0

Der Fehler ist in SecurityConfiguration statt:

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

sollte sein:

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth.inMemoryAuthentication() 
      .withUser("user").password("password").roles("USER"); 
} 

Aber ich weiß nicht, warum das so geschrieben werden sollte. :/

1

Verwenden @EnableGlobalAuthentication für diese Klasse angibt, verwendet werden kann, eine globale Instanz von AuthenticationManagerBuilder

@Configuration 
@EnableWebSecurity 
@EnableGlobalAuthentication 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     //  
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception {  
     //     
    } 
}