非Spring Boot的Spring应用中DefaultSecurityFilterChain为空致接口未受保护
问题分析与解决方案
核心原因
日志显示[org.springframework.security.web.DefaultSecurityFilterChain] Will not secure any request,本质是Spring Security的过滤器链未被Servlet容器加载。非Spring Boot环境不会自动完成Spring Security与Servlet容器的绑定,必须手动配置关键的代理过滤器,否则Spring Security的认证规则无法作用于请求。
非Spring Boot环境下Spring Security标准配置步骤
1. 配置web.xml,注册Spring Security核心代理过滤器
这是最关键的一步,必须在web.xml中添加DelegatingFilterProxy,它负责将请求转发到Spring容器中的springSecurityFilterChain bean(Spring Security默认的过滤器链实例)。
<!-- Spring Security核心过滤器代理 --> <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> <!-- 加载Spring上下文配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <!-- 指定你的Spring配置文件路径 --> <param-value>/WEB-INF/context.xml</param-value> </context-param>
2. 确保Spring上下文加载Security配置类
在context.xml中,通过组件扫描或直接注册bean的方式,让Spring容器加载你的SecurityConfiguration类:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描包含SecurityConfiguration的包 --> <context:component-scan base-package="com.yourcompany.config"/> <!-- 或者直接注册配置类bean(二选一即可) --> <!-- <bean class="com.yourcompany.config.SecurityConfiguration"/> --> </beans>
3. 完善SecurityConfiguration配置
确保配置类上添加@EnableWebSecurity注解,并重写必要的配置方法:
package com.yourcompany.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 示例:内存用户认证,生产环境建议替换为数据库/LDAP认证 auth.inMemoryAuthentication() .passwordEncoder(new BCryptPasswordEncoder()) .withUser("user") .password(new BCryptPasswordEncoder().encode("password")) .roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() // 所有请求必须认证 .and() .httpBasic(); // 开启HTTP Basic认证 } }
额外注意事项
- 依赖检查:确保项目引入了
spring-security-web和spring-security-config依赖,版本与Spring核心框架版本匹配。 - 密码编码:生产环境禁止使用
{noop}明文密码,必须使用标准密码编码器(如BCryptPasswordEncoder)。 - 日志验证:部署后查看日志,确认
springSecurityFilterChainbean已被Spring容器加载,且过滤器映射生效。
内容的提问来源于stack exchange,提问作者Otis Ottington
相关产品推荐
相关产品推荐

