You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:15:14