1.問題
本文討論Spring安全配置問題 - 應用程序引導過程拋出如下異常:web
SEVERE: Exception starting filter springSecurityFilterChain org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined
2.緣由
此異常的緣由很簡單 - Spring Security查找名爲springSecurityFilterChain的bean(默認狀況下),但沒法找到它。主要的Spring安全過濾器 - DelegatingFilterProxy - 在web.xml中定義了這個bean:spring
<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>
這只是一個代理,它將其全部邏輯委託給springSecurityFilterChain bean。安全
3.解決方案
上下文中缺乏此bean的最多見緣由是security XML配置沒有定義<http>元素:app
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:sec="http://www.springframework.org/schema/security" xsi:schemaLocation=" http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> </beans:beans>
若是使用XML配置Security命名空間 - 如上例所示,則聲明一個簡單的<http>元素將確保建立過濾器bean而且全部內容都正確啓動:url
<http auto-config='true'> <intercept-url pattern="/**" access="ROLE_USER" /> </http>
另外一個可能的緣由是Security配置根本不會導入到Web應用程序的總體上下文中。spa
若是安全性XML配置文件名爲springSecurityConfig.xml,請確保導入資源:代理
@ImportResource({"classpath:springSecurityConfig.xml"})
或者用XML:code
<import resource="classpath:springSecurityConfig.xml" />
最後,能夠在web.xml中更改過濾器bean的默認名稱 - 一般使用帶有Spring Security的現有過濾器:xml
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> <init-param> <param-name>targetBeanName</param-name> <param-value>customFilter</param-value> </init-param> </filter>
4.總結
本文討論了一個很是具體的Spring Security問題 - 缺乏過濾器鏈bean - 並展現了這個常見問題的解決方案。get