Spring Boot Security部署Tomcat WAR时FilterChain未触发问题求助
针对Spring Boot 2.7.5打包WAR部署到Tomcat 8.5后Security配置不生效的问题,按以下步骤排查:
1. 完善WAR打包的入口类配置
外部Tomcat部署WAR时,必须让Spring Boot应用正确初始化,主应用类需要继承SpringBootServletInitializer并覆盖configure方法:
@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
缺少该配置会导致Spring上下文无法正常加载,进而使Security配置失效。
2. 确认配置类的扫描范围
确保WebSecurityConfig所在包被Spring组件扫描覆盖:
@SpringBootApplication默认扫描自身包及子包,若WebSecurityConfig在其他路径下,需添加@ComponentScan指定扫描路径,示例:@SpringBootApplication @ComponentScan(basePackages = {"com.your.config", "com.your.controller"}) public class YourApplication { // ... }
3. 验证Tomcat部署后的访问路径
Tomcat部署WAR后,应用上下文路径默认与WAR包名一致(如WAR名为demo-app.war,上下文路径为/demo-app),此时正确访问路径应为:
http://your-tomcat-ip:8080/demo-app/api/hello/hi
若直接访问http://your-tomcat-ip:8080/api/hello/hi,请求会匹配Tomcat默认上下文,触发Tomcat自身的认证拦截,返回Full authentication is required to access this resource。
4. 排查Security自动配置冲突
检查主应用类是否误排除了Spring Security自动配置,比如存在@SpringBootApplication(exclude = SecurityAutoConfiguration.class),这种配置会导致自定义Security规则无法生效。
额外验证步骤
在WebSecurityConfig中添加初始化日志,确认配置类是否被实例化:
@EnableWebSecurity @Configuration public class WebSecurityConfig { public WebSecurityConfig() { System.out.println("WebSecurityConfig 已初始化"); } // 原有filterChain配置... }
部署后查看Tomcat日志,若没有该输出,说明配置类未被Spring加载,需重新检查扫描范围。
内容的提问来源于stack exchange,提问作者Jan Verhagen

