@EnableAuthorizationServer替代方案及配置冲突解决
你遇到的冲突本质是依赖版本和组件代差不兼容导致的:
你使用的spring-cloud-starter-oauth2 2.2.5.RELEASE是Spring Cloud体系下已经停止功能更新的旧版OAuth2实现,这个组件从设计之初就是基于WebSecurityConfigurerAdapter开发的,@EnableAuthorizationServer注解导入的AuthorizationServerSecurityConfiguration配置类本身就硬继承了该适配器,只要加载这个注解,容器里必然存在WebSecurityConfigurerAdapter类型的Bean。而Spring Security 5.7+版本启动时会强制检测配置模式,不允许WebSecurityConfigurerAdapter和SecurityFilterChain两种配置方式共存,因此直接抛出你看到的异常。
另外你贴的代码里有个笔误:授权类型配置的resfresh_token拼写错误,正确写法是refresh_token。
推荐方案:迁移到新版授权服务器组件
旧版Spring Cloud OAuth2已经进入维护状态,不会再做新特性适配,官方已经将OAuth2授权服务器能力迁移到新的独立组件中,完全基于SecurityFilterChain的新配置范式开发,没有WebSecurityConfigurerAdapter依赖,也不需要使用@EnableAuthorizationServer注解。
你只需要移除原有spring-cloud-starter-oauth2依赖,替换为新版授权服务器组件,按照新的Bean配置方式实现原有逻辑即可:
- 客户端配置:声明
RegisteredClientRepository类型的Bean,替代原有ClientDetailsServiceConfigurer中的内存客户端配置 - 端点配置:通过
OAuth2AuthorizationServerConfigurer自定义授权端点逻辑,注入你自己的AuthenticationManager关联密码模式认证 - 过滤链配置:分别声明授权服务专用
SecurityFilterChain和业务应用安全SecurityFilterChain,通过@Order注解指定加载优先级,不会出现配置冲突。
临时兼容方案(不推荐长期使用)
如果短期内无法完成组件迁移,必须保留@EnableAuthorizationServer注解,你只能暂时沿用继承WebSecurityConfigurerAdapter的写法,或者将Spring Boot版本降级到2.3.x及以下、对应旧版Spring Cloud OAuth2原生适配的版本。但这种方式会持续依赖已废弃的API,后续升级Spring Boot/Spring Security版本会遇到更多兼容问题,不建议长期使用。
内容的提问来源于stack exchange,提问作者Chinedu

