1.問題
本文討論Spring安全配置問題 - 應用程序引導過程拋出以下異常:
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:
<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配置沒有定義
<?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 auto-config='true'>
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
另一個可能的原因是Security配置根本不會導入到Web應用程序的整體上下文中。
如果安全性XML配置文件名為springSecurityConfig.xml,請確保導入資源:
@ImportResource({"classpath:springSecurityConfig.xml"})
或者用XML:
<import resource="classpath:springSecurityConfig.xml" />
最后,可以在web.xml中更改過濾器bean的默認名稱 - 通常使用帶有Spring Security的現有過濾器:
<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 - 並展示了這個常見問題的解決方案。