配置Spring Security的Gradle项目遇OAuth2启动错误求助
解决Spring OAuth2应用中WebSecurityConfigurerAdapter找不到的栈错误
嘿,这个问题我之前踩过一模一样的坑!不管是本地gradle test还是Heroku部署崩溃,核心原因都是同一个——WebSecurityConfigurerAdapter类在Spring Security 5.7及以后的版本里已经被彻底移除了,而你的项目依赖的Spring Boot版本(大概率是2.7.x及以上)刚好引入了这个新版Spring Security,导致依赖这个类的自动配置(比如OAuth2SsoDefaultConfiguration)无法正常加载,最终抛出BeanDefinitionStoreException。
下面是一步步的解决方案:
1. 先确认你的依赖版本
打开项目根目录下的build.gradle文件,先看Spring Boot的版本号:
- 如果是
2.7.x或更高,对应的Spring Security就是5.7+,这个版本已经删掉了WebSecurityConfigurerAdapter。 - 你也可以运行
./gradlew dependencies命令查看完整的依赖树,确认Spring Security的具体版本,确保不是误引入了新版依赖。
2. 替换WebSecurityConfigurerAdapter的旧用法
如果你的代码里直接继承了这个类,必须改成Spring官方推荐的组件式安全配置:
旧代码(会报错):
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 你的原有配置 } }
新代码(兼容新版Spring Security):
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.web.SecurityFilterChain; import org.springframework.context.annotation.Bean; import static org.springframework.security.config.Customizer.withDefaults; @EnableWebSecurity @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 关闭CSRF(如果是前后端分离或不需要的话,可根据实际情况调整) .csrf(AbstractHttpConfigurer::disable) // 配置权限规则 .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) // 启用OAuth2登录,适配Google OAuth2 .oauth2Login(withDefaults()); return http.build(); } }
3. 调整OAuth2 SSO的依赖与配置
错误日志里提到的OAuth2SsoDefaultConfiguration是旧版的OAuth2单点登录自动配置,它依赖WebSecurityConfigurerAdapter,所以需要切换到新版的OAuth2客户端依赖:
- 在
build.gradle里确保依赖的是新版的starter:implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' - 然后在
application.properties(或application.yml)里配置Google OAuth2的客户端信息:spring.security.oauth2.client.registration.google.client-id=你的Google客户端ID spring.security.oauth2.client.registration.google.client-secret=你的Google客户端密钥 spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
4. 本地测试与Heroku部署验证
- 先在本地运行
./gradlew clean test,确认测试用例能正常通过;再启动应用./gradlew bootRun,检查是否能正常启动并跳转Google登录。 - 部署到Heroku之前,确保
Procfile配置正确(比如web: java -jar build/libs/你的应用名称.jar),Heroku的Gradle构建会自动拉取正确的依赖,只要本地验证通过,部署后应该就能正常运行了。
额外注意点
- 别想着降级Spring Security版本来兼容旧类,旧版本存在已知的安全漏洞,官方已经停止维护,迁移到新配置才是长久之计。
- 如果你的项目里还有其他依赖
WebSecurityConfigurerAdapter的代码(比如获取AuthenticationManager),也要对应调整——比如可以通过AuthenticationManagerBuilder的Bean来获取,或者直接用@Autowired注入。
内容的提问来源于stack exchange,提问作者Alex Malcolm
相关产品推荐
相关产品推荐

