2014-05-23 170 views
1

我試圖在Spring Boot和嵌入式Jetty的「fat」可執行JAR中從main()方法初始化Spring Security。 我使用Spring Security與Java配置(無web.xml)。問題是嵌入式Jetty無法註冊springSecurityFilterChain過濾器。嵌入式Jetty環境中的Spring Boot和Spring Security集成

當我運行相同的JAR在碼頭(mvn jetty:run)戰爭的話,正常工作時,我看到:

Initializing Spring embedded WebApplicationContext 

但在嵌入式碼頭運行時,我看不出有什麼WebApplicationContext得到初始化。

我有這個EmbeddedServletContainerFactory

@Bean 
public EmbeddedServletContainerFactory servletContainerFactory() { 
    JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(); 
    factory.setPort(8080); 
    factory.addServerCustomizers(new JettyServerCustomizer() { 
     public void customize(Server server) {  
     // TODO: INITIALIZE SPRING SECURITY SOMEHOW... 
     } 
    }); 
    return factory; 
} 

我試圖創造AbstractSecurityWebApplicationInitializer一個子類,但它是在衝突與我SpringBootServletInitializer。在我pom.xml我有這些依賴關係:

  • spring-boot-starter-jetty
  • spring-boot-starter-logging
  • spring-boot-starter

當我添加spring-boot-web它拋出:

java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 

我也試圖註冊DelegatingFilterProxy與碼頭,但隨後拋出:

java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered? 

我猜我需要告訴碼頭使用WebApplicationContext,但如何?

+0

你爲什麼不用一個主要的方法創建一個類來運行你的應用程序?春季啓動會爲你做設置。請參閱http://spring.io/guides/gs/securing-web/,然後將jar轉換爲war http://spring.io/guides/gs/convert-jar-to-war/ –

+0

我正在做 - 就像Spring Boot文檔所建議的一樣。我只需要從'main()'初始化Spring Security。 – albogdano

+0

SPring引導將執行此操作以及引導Jetty容器。我不明白你爲什麼要自己創建一個容器,因爲spring boot會爲你做所有這些...... –

回答

3

你的設置禁止Spring Boot發揮它的魔力。而不是讓Spring Boot自己設置容器。您可以簡單地將JettyServerCustomizer添加到配置中作爲@Bean。這將執行它,你可以做任何你需要的註冊。

這仍然允許Spring Boot發揮它的魔力,並且您已經註冊了您需要的額外端點。

另一種解決方案可能是將servlet作爲ServletRegistrationBean添加到您的配置中,然後它將自動被Spring Boot添加。

+0

謝謝!我知道我錯過了那樣簡單的事情。 – albogdano