1. 問題
本文討論了一個 Spring Security 配置問題——應用程序引導過程拋出以下異常:
SEVERE: Exception starting filter springSecurityFilterChain
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No bean named 'springSecurityFilterChain' is defined
2. 導致原因
該異常的原因非常明確——Spring Security 查找名為 springSecurityFilterChain(默認情況下),並且找不到它。 此 Bean 是由主 Spring Security 過濾器——DelegatingFilterProxy——在 web.xml中定義的:
<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 缺失的最常見原因是,安全 XML 配置中缺少 未定義 <http>元素
<?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 配置正在使用安全命名空間(如上面的示例),則聲明 一個簡單的 <http> 元素將確保過濾器 bean 創建並一切正常啓動:
<http auto-config='true'>
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
另一個可能的原因是,安全配置根本沒有導入到整個 Web 應用程序的上下文中。
如果安全 XML 配置文件的名稱為 springSecurityConfig.xml,請確保 資源已導入:
@ImportResource({"classpath:springSecurityConfig.xml"})
或者在 XML 中:
<import resource="classpath:springSecurityConfig.xml" />
最後,可以使用 Spring Security 中的現有過濾器,在 web.xml 中更改過濾器 bean 的默認名稱。
<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,並展示瞭解決此常見問題的方案。