2013-02-16 191 views
4

出於某種原因(我真的不能rembember爲什麼:))我決定只使用Java來配置Spring應用程序。此外,我會盡量避免web.xml彈簧安全的春天Java配置

我開始與follinging兩個java配置文件。 ApplicationBootstrap.java

public class ApplicationBootstrap implements WebApplicationInitializer { 
    //public class Initializer 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
     rootContext.register(ApplicationConfig.class); 
     rootContext.refresh(); 

    // Manage the lifecycle of the root appcontext 
    servletContext.addListener(new ContextLoaderListener(rootContext)); 
    servletContext.setInitParameter("defaultHtmlEscape", "true"); 
    servletContext.setInitParameter("spring.profiles.active", "Production"); 


    // now the config for the Dispatcher servlet 
    AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext(); 
     mvcContext.register(ApplicationConfig.class); 
     mvcContext.getEnvironment().setActiveProfiles("Production"); 
     mvcContext.getEnvironment().setDefaultProfiles("Production"); 

    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(mvcContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/api/*"); 


} 

和ApplicationConfig.java

@Configuration() 
@Profile({"Production", "ControllerUnitTest"}) 
@EnableWebMvc 
@ComponentScan(basePackages = "com.consius.activework.server" ) 
@EnableAspectJAutoProxy 
public class ApplicationConfig extends WebMvcConfigurerAdapter { 


} 

此擔任espected。沒有我的問題開始。我的想法是使用spring-security,並且尋找一種使用Java配置spring-security的方法。 過了一段時間我放棄了,我發現沒有辦法使用Java配置spring-security。 我決定回到XML的安全配置。

我創建了一個包含這一個web.xml:

<filter> 
     <filter-name>filterChainProxy</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>filterChainProxy</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

到ApplicationConfig.java我說:

@ImportResource({ "classpath:/spring-security.xml" }) 

並創建一個新的XML文件命名爲彈簧的security.xml

<security:http auto-config='true' create-session="never" realm="Restricted Service" use-expressions="true"> 
    <security:intercept-url pattern="/rest/**" access="permitAll()" />    
</security:http> 

根據文檔,這是最小的配置。

試圖運行此提供了以下錯誤(我無法理解爲什麼)

SEVERE: Exception starting filter filterChainProxy 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'filterChainProxy' is defined 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:549) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1096) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1121) 
    at org.springframework.web.filter.DelegatingFilterProxy.initDelegate(DelegatingFilterProxy.java:326) 
    at org.springframework.web.filter.DelegatingFilterProxy.initFilterBean(DelegatingFilterProxy.java:236) 
    at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:194) 
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281) 

誰能幫助我? 我想我已經做了一些明顯的錯誤,但我無法看到它。

// LG

回答

0

DeleagatingFilterProxy DOC

代理爲標準的Servlet 2.3過濾器,委託給一個實現Filter接口Spring管理的bean。

默認情況下,此實現將所有調用委託給與過濾器具有相同名稱的bean。 (你的情況是filterChainProxy)。所以,你需要定義一個名爲filterChainProxy豆和這個bean必須實現Filter接口

但是Spring Security提供了一個名爲springSecurityFilterChain實施Filter和適合春季的安全豆。因此,將您的過濾器名稱更改爲springSecurityFilterChain

link可以幫助你

+0

我改個名字,,但錯誤仍然存​​在:: - 嚴重:異常開始過濾springSecurityFilterChain org.springframework.beans.factory.NoSuchBeanDefinitionException:無豆命名爲「springSecurityFilterChain」的定義 \t在org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:549) \t在org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1096) – 2013-02-16 15:26:00

+0

@ lg.lindstrom剛添加類似問題的鏈接 – ben75 2013-02-16 15:49:15

6

您的過濾器的安全應該是springSecurityFilterChain的名稱,它是分配由Spring安全命名空間中的Spring bean的名字。

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

而且你已經使用ApplicationConfig兩個根上下文(通過的ContextLoaderListener加載),也是Web應用程序上下文(通過DispatcherServlet的加載),這將是更好地保持不同的上下文兩者並加載Spring Security的一個只有通過根上下文

更新 澄清你的問題的意見 - Spring MVC的應用程序通常裝載了2種應用環境中,你已經使用指定的一個ContextLoaderListener(稱之爲Root Web Application Context),而第二個加載usin g DispatcherServlet(稱之爲Servlet Web Application Context),它實際上是根上下文的子節點,並且在根環境中定義了可見的bean。根上下文包含與核心應用程序相關的bean(服務,存儲庫,實體管理器,安全等),而servlet應用程序上下文僅包含Spring MVC(控制器,視圖解析器等)所需的東西。現在在你的情況下,你已經指定ApplicationConfig作爲根上下文以及servlet上下文的一部分,這是不需要的。您可以改爲使用ApplicationConfig作爲根上下文,併爲Web應用程序上下文使用不同的MVC特定上下文。

+0

我不太瞭解您的第二條評論? – 2013-02-16 15:28:22

+1

現在添加了一個更新,詳細說明了我在第二條評論 – 2013-02-16 17:28:23

+0

@ lg-lindstrom中的含義。這種方式不需要包含過濾器配置。您可以在ApplicationBootstrap中配置過濾器。請參閱溫室示例https://github.com/SpringSource/greenhouse/blob/213d2c742d472e602defcde801dd118e098d73c6/src/main/java/com/springsource/greenhouse/config/GreenhouseWebAppInitializer.java。您已經爲調度程序servlet具有單獨的上下文,但不需要在那裏使用ApplicationConfig。 – Ritesh 2013-02-16 17:28:46

1

如果您使用的是Spring 3.1+,那麼您可以嘗試將上下文配置文件添加到web.xml中;這將把它們結合在一起。爲了簡單地在沒有web配置的情況下工作,請嘗試如下所示:

servletContext.addFilter(
      "springSecurityFilterChain", 
      new DelegatingFilterProxy("springSecurityFilterChain")) 
     .addMappingForUrlPatterns(null, false, "/*"); 
11

如何堅持使用Java配置?

@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    // ... 
} 

public class WebSecurityInitializer 
     extends AbstractSecurityWebApplicationInitializer { 
} 

便捷地,WebSecurityInitializer會爲您註冊Spring Security Servlet過濾器!下面是用大量細節的一個很好的解釋:

http://docs.spring.io/spring-security/site/docs/3.2.x/guides/helloworld.html

順便說一句...如果沒有上述情況,但也可以手動做了登記:

public class DispatcherServletInitializer 
     extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) 
      throws ServletException { 
     servletContext 
      .addFilter("securityFilter", 
         new DelegatingFilterProxy("springSecurityFilterChain")) 
      .addMappingForUrlPatterns(null, false, "/*"); 

     super.onStartup(servletContext); 
    } 

    // Various other required methods... 

} 

這種方式,你可以約,就是忘記惱人的web.xml。 :)

+0

我試過你的建議。我也不喜歡web.xml。但我仍然得到'NoSuchbeanException。 「你可以請看看。 http://stackoverflow.com/questions/32575242/nosuchbeandefinitionexception-during-spring-container-start-up – 2015-09-15 05:57:00