SpringBoot应用迁移后自定义JWT安全配置失效,默认安全配置自动启用问题排查
兄弟,我看了你的问题描述和代码,核心问题应该是Spring没有正确加载你的自定义SecurityConfig配置类,导致默认的SecurityAutoConfiguration自动生效,才会出现生成随机密码的日志。结合你提到的“加了日志在SecurityConfig里没输出”的情况,咱们一步步来排查解决:
1. 给SecurityConfig补上关键注解:@EnableWebSecurity
你的SecurityConfig类里漏掉了@EnableWebSecurity这个核心注解!这个注解是告诉Spring“我要使用自定义的安全配置,不要用默认的”,没有它的话,Spring会自动启用默认的安全配置逻辑。
修改你的SecurityConfig,加上这个注解:
@Configuration @EnableWebSecurity // 必须加上这个! @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig { // 你的现有代码... }
2. 确认Spring能扫描到你的配置类
虽然你加了scanBasePackages="com.inn.cafe",但还是要仔细核对:
- 你的Spring Boot主类所在的包是不是
com.inn.cafe?如果主类在更上层的包(比如com.inn),那com.inn.cafe.JWT是子包,没问题;但如果主类在其他无关包,肯定扫不到。 - 可以在主类上明确指定扫描配置类的包,确保覆盖到:
@SpringBootApplication(scanBasePackages = {"com.inn.cafe", "com.inn.cafe.JWT"}) public class CafeManagementSystemApplication { public static void main(String[] args) { SpringApplication.run(CafeManagementSystemApplication.class, args); } } - 另外,日志里显示“Found 0 JPA repository interfaces”,说明JPA仓库也没被扫描到,同样可以用
@EnableJpaRepositories(basePackages = "com.inn.cafe.repository")指定仓库路径(替换成你实际的仓库包)。
3. 验证配置类是否真的被加载
在SecurityConfig的构造方法里加个日志,确认启动时是否初始化:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig { private static final Logger log = LoggerFactory.getLogger(SecurityConfig.class); public SecurityConfig() { log.info("=== SecurityConfig 已初始化 ==="); } // 你的其他代码... }
如果启动日志里看不到这条信息,那就是包扫描的问题,再仔细核对包路径和主类的扫描配置。
4. 清理IDE缓存和构建目录
因为是用IntelliJ迁移的项目,可能存在缓存或旧编译文件的问题:
- 执行
mvn clean install(如果是Maven项目)或者gradle clean build(Gradle项目),清理并重新编译项目 - 在IntelliJ里点击
File -> Invalidate Caches...,选择"Invalidate and Restart"重启IDE - 手动删除target(或build)目录,再重新构建
5. 检查依赖版本是否匹配
确保spring-boot-starter-security的版本和你的Spring Boot版本一致,不要单独引入不同版本的spring-security-web或spring-security-config,避免依赖冲突导致配置失效。
按照上面的步骤来,应该能解决你的问题。核心就是先补上@EnableWebSecurity,再确认配置类被Spring正确扫描到,基本就能让你的自定义JWT安全配置生效,替代默认的安全配置了。
备注:内容来源于stack exchange,提问作者Pablo Costa

