2016-04-12 15 views
2

Die Dokumentation für Spring Security besagt, dass, um die Java Config verwenden können wir die AbstractSecurityWebApplicationInitializer Klasse erweitern, die alle Nesesarry Beans für Spring Security eingerichtet werden, um zu arbeiten. Dieser Ansatz funktioniert einwandfrei, der Initialisierer wird automatisch ausgeführt und Spring Security wird beim Start der Anwendung ordnungsgemäß initialisiert.Spring Security - bedingte WebApplicationInitializer

Aber jetzt bin ich konfrontiert mit einem Szenario, wenn diese Initialisierung sollte abhängig von einer Systemeigenschaft sein. Daher möchte ich meine Initialisierer-Klasse nur dann einfügen, wenn eine Systemeigenschaft eingestellt ist (zum Beispiel: app.enablesecurity=true) und diesen Initialisierer in keinem anderen Fall ausführt.

scheiterte ich mit jeder Lösung zu kommen für dieses Szenario, weil:

  • In AbstractSecurityWebApplicationInitializer die onStartup Methode final markiert, so kann ich außer Kraft setzt es nicht und eine Bedingung hinzufügen
  • Wenn ich AbstractSecurityWebApplicationInitializer es nur verlängern ist immer automatisch von Spring abgeholt und instanziiert (oder zumindest Spring versucht, eine Instanz davon zu erstellen, kann es fehlschlagen), auch wenn ich es als eine private/innere/geschachtelte Klasse deklarieren.

So soweit ich weiß, die einzige Möglichkeit, bedingt dieses initializer einschließlich ist cglib/Javassist verwenden, um dynamisch eine Klasse zu erstellen, die AbstractSecurityWebApplicationInitializer erstreckt.

Gibt es einen anderen Weg? Vielleicht gibt es eine Methode, die es mir erlaubt, meine Implementierung davor zu verbergen, von Spring aufgegriffen und zu einem späteren Zeitpunkt manuell ausgeführt zu werden?

Antwort

0

können Sie Config-Klasse wie folgt verwenden Ihre Sicherheitsverhalten konfigurieren

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Value("${app.enablesecurity}") 
    private boolean securityEnabled; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     if (securityEnabled) { 
      http.csrf().disable(); 
      ... 
     } else { 
      http. ... 
     } 
    } 
}