最简Spring Security配置导致Spring Boot应用失效求助
检查DispatcherServlet的映射配置
启动应用时查看日志,确认DispatcherServlet的映射路径是否为/*(默认配置)。如果映射被修改为/static/**或其他窄路径,控制器请求会无法被处理,直接落入静态资源处理器。日志关键字:Mapping servlet: 'dispatcherServlet' to排查WebMvc配置冲突
检查是否存在自定义的WebMvcConfigurer实现,尤其关注重写的addResourceHandlers或configurePathMatch方法:- 如果开启了后缀模式匹配(
setUseSuffixPatternMatch(true)),可能导致/login被匹配为静态资源文件; - 如果资源处理器的路径规则(比如
/**)覆盖了控制器路径,会优先匹配静态资源。
- 如果开启了后缀模式匹配(
确认Spring Boot版本兼容性
JDK 21要求Spring Boot 3.2及以上版本,若使用低于3.2的版本,可能存在WebMvc与Spring Security的路由逻辑兼容性问题。检查build.gradle中的Spring Boot依赖版本,确保适配JDK 21。调试过滤器链执行流程
添加调试日志或断点,验证请求经过Spring Security过滤器后是否正确传递给DispatcherServlet:- 开启
logging.level.org.springframework.security.web=DEBUG,查看请求在过滤器链中的流转; - 确认没有过滤器修改了请求的URI或调度模式,导致请求被直接转发到静态资源处理器。
- 开启
排查自定义Filter的干扰
检查是否有自定义Filter注册到容器中,且优先级高于Spring Security的Filter。这类Filter可能修改了请求的处理逻辑,导致控制器请求无法被正常路由。开启Spring MVC请求匹配调试日志
设置logging.level.org.springframework.web=DEBUG,查看请求/login的匹配过程:- 观察日志中哪个
HandlerMapping先匹配到请求,如果是ResourceHandlerMapping优先于RequestMappingHandlerMapping,说明路径规则配置有误。
- 观察日志中哪个
显式区分静态资源与控制器路径
显式配置Spring Security的静态资源放行规则,同时明确静态资源的映射路径,避免与控制器路径冲突:@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/static/**", "/css/**", "/js/**").permitAll() .anyRequest().permitAll() ); return http.build(); }同时在
WebMvcConfigurer中明确静态资源位置:@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); } }
内容的提问来源于stack exchange,提问作者Ian

