Grails4.0.6升级至5.0.1出现HttpSecurity Bean创建失败报错如何解决
问题根因
错误日志明确指向org.springframework.security.authentication.AuthenticationManager接口存在3个实现Bean,且未指定主实例,导致Spring Security初始化HttpSecurity时无法选择默认实例,触发启动失败。
出现多实例的核心原因是依赖版本不兼容+安全组件重复注册:
- Grails 5.0.1 内置Spring Boot 2.6.x、Spring Security 5.6.x版本,你手动额外声明了Spring Security相关包的版本,同时引入了适配Grails 4的
spring-security-rest:3.0.1插件,该插件会独立注册一个AuthenticationManager实例 - Spring Boot Actuator的安全自动配置、Spring Security核心上下文、第三方安全插件各自注册了AuthenticationManager,没有指定主实例导致冲突
解决方案
1. 清理冲突依赖
修改build.gradle,删除手动声明的Spring Security单独依赖,升级spring-security-rest插件到适配Grails5的版本:
// 删除以下三行手动声明的Spring Security依赖,直接使用Grails内置的匹配版本即可 // implementation "org.springframework.security:spring-security-config:5.6.0" // implementation "org.springframework.security:spring-security-messaging:5.6.0" // implementation "org.springframework.security:spring-security-web:5.6.0" // 升级spring-security-rest到适配Grails5的4.0.x版本 implementation 'org.grails.plugins:spring-security-rest:4.0.0' implementation 'org.grails.plugins:spring-security-rest-gorm:4.0.0'
2. 显式指定主AuthenticationManager
如果清理依赖后仍存在冲突,在你的Spring Security配置类中,显式声明主AuthenticationManager实例:
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Primary import org.springframework.security.authentication.AuthenticationManager import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean @Primary @Override AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean() } // 保留原有安全配置逻辑 }
3. 可选:禁用Actuator安全自动配置
如果你不需要对actuator端点做权限控制,可以在application.yml中关闭actuator的安全自动配置,避免额外的安全Bean注册:
management: security: enabled: false
操作完成后执行./gradlew clean清理缓存后重新启动应用即可。
内容的提问来源于stack exchange,提问作者Chiranjib Karn
相关产品推荐
相关产品推荐

