1. 问题现象

本文讨论一个 Spring Security 配置的经典踩坑场景——应用启动时抛出以下异常:

SEVERE: Exception starting filter springSecurityFilterChain
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No bean named 'springSecurityFilterChain' is defined

2. 根本原因

这个异常的原因其实很简单:Spring Security 默认会查找名为 springSecurityFilterChain 的 bean,但没找到。这个 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>

⚠️ DelegatingFilterProxy 本质是个代理,它会把所有逻辑委托给 springSecurityFilterChain bean 处理。

3. 解决方案

导致这个 bean 缺失的常见原因有三种,针对性解决如下:

3.1 缺少 <http> 配置项

最常见的情况是:安全配置 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>

修复方法:添加一个简单的 <http> 元素,Spring Security 就会自动创建所需的过滤器链 bean:

<http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>

3.2 安全配置未被加载

另一种可能是安全配置文件根本没有被导入到应用上下文中。

假设安全配置文件名为 springSecurityConfig.xml,确保通过以下方式导入:

Java 配置方式

@ImportResource({"classpath:springSecurityConfig.xml"})

XML 配置方式

<import resource="classpath:springSecurityConfig.xml" />

3.3 自定义过滤器名称

如果需要修改默认的 bean 名称(比如复用现有过滤器),可以在 web.xml 中通过 targetBeanName 参数指定:

<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 缺失,并提供了三种典型场景的解决方案:

  1. ✅ 检查安全配置中是否包含 <http> 元素
  2. ✅ 确认安全配置文件已正确导入应用上下文
  3. ✅ 必要时通过 targetBeanName 自定义 bean 名称

掌握这些排查思路,遇到类似问题就能快速定位解决。


原始标题:No bean named 'springSecurityFilterChain' is defined