Spring Security Java配置未保护URL问题排查求助
问题分析与解决方案
我一看你的配置就发现核心问题了——Spring Security的过滤器链没有被注册到Servlet容器中,这就是为什么所有安全规则和过滤器都完全失效的原因。
在XML配置时代,我们会通过<filter>和<filter-mapping>标签把Spring Security的springSecurityFilterChain注册到容器里,但切换到Java配置后,你需要手动完成这个注册,或者用Spring提供的便捷类来自动处理。
方案一:使用AbstractSecurityWebApplicationInitializer(推荐)
创建一个继承自AbstractSecurityWebApplicationInitializer的类,它会自动帮你注册Spring Security的过滤器链,并且自动关联你的@EnableWebSecurity配置类:
package com.test.project; import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { // 不需要写任何代码,空实现即可 }
这个类会自动完成以下操作:
- 注册
springSecurityFilterChain过滤器 - 确保过滤器映射覆盖所有请求路径
- 自动发现并关联你的
SecurityConfiguration类(因为它带有@EnableWebSecurity注解)
方案二:在现有WebApplicationInitializer中手动注册过滤器
如果你不想新增类,也可以在你现有的onStartup方法里手动添加Spring Security过滤器的注册逻辑:
@Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.test.project"); servletContext.addListener(new ContextLoaderListener(context)); // 关键:注册Spring Security过滤器链 FilterRegistration.Dynamic securityFilter = servletContext.addFilter( "springSecurityFilterChain", DelegatingFilterProxy.class ); // 让过滤器拦截所有请求路径 securityFilter.addMappingForUrlPatterns(null, false, "/*"); ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context)); servlet.setLoadOnStartup(1); servlet.addMapping("/rest/*"); }
额外检查点
除了过滤器注册,你还可以确认以下几点:
- 确保你的
SecurityConfiguration类被Spring上下文扫描到:context.setConfigLocation("com.test.project")应该能覆盖到这个类,但如果你的项目用了@ComponentScan,要确保它包含com.test.project包 - 你的自定义
AuthenticationFilter是否正确设置了AuthenticationManager:可以在authenticationFilter()方法里加上filter.setAuthenticationManager(authenticationManager()),避免过滤器无法获取认证管理器
内容的提问来源于stack exchange,提问作者Squeez
相关产品推荐
相关产品推荐

