You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.0.0.M7中ResourceServerTokenServicesConfiguration消失问题咨询

问题解答:Spring Boot 2.0.0.M7中ResourceServerTokenServicesConfiguration被移除的原因及替代方案

我之前在升级Spring Boot 2.0里程碑版本的时候也碰到过这个配置变更的坑,刚好可以给你梳理下原因和解决办法:

一、类被移除的原因

Spring Boot 2.0的里程碑(M系列)版本本身就是用于迭代和重构的预览版本,API和自动配置逻辑会频繁调整。这次移除ResourceServerTokenServicesConfiguration主要是因为Spring团队对OAuth2资源服务的自动配置逻辑做了重构优化:

  • 原来的自动配置默认提供UserInfoTokenServices,主要适配的是OAuth2 SSO场景(通过用户信息端点获取用户身份),但这个默认实现和Spring Security OAuth2原生的资源服务配置逻辑存在冲突,灵活性不足。
  • 重构后转而让ResourceServerSecurityConfigurer提供默认的DefaultTokenServices,这是Spring Security OAuth2原生的资源服务token服务实现,更贴合标准的OAuth2资源服务架构(比如支持JWT、令牌存储等场景)。

二、替代方案

根据你的业务场景,有两种可行的解决方向:

1. 继续使用UserInfoTokenServices(适配原SSO场景)

如果你的应用依赖UserInfoTokenServices从用户信息端点获取身份信息,只需要手动配置该Bean,替代原来的自动配置逻辑即可:

@Configuration
public class CustomOAuth2ResourceServerConfig {

    @Autowired
    private OAuth2ClientProperties oAuth2ClientProperties;

    @Autowired(required = false)
    private RestTemplate restTemplate;

    @Autowired(required = false)
    private AuthoritiesExtractor authoritiesExtractor;

    @Autowired(required = false)
    private PrincipalExtractor principalExtractor;

    @Bean
    @ConditionalOnMissingBean(ResourceServerTokenServices.class)
    public UserInfoTokenServices userInfoTokenServices() {
        UserInfoTokenServices services = new UserInfoTokenServices(
                oAuth2ClientProperties.getUserInfoUri(), 
                oAuth2ClientProperties.getClientId()
        );
        if (restTemplate != null) {
            services.setRestTemplate(restTemplate);
        }
        services.setTokenType(oAuth2ClientProperties.getTokenType());
        if (authoritiesExtractor != null) {
            services.setAuthoritiesExtractor(authoritiesExtractor);
        }
        if (principalExtractor != null) {
            services.setPrincipalExtractor(principalExtractor);
        }
        return services;
    }
}

这段代码完全复刻了原来自动配置的逻辑,把它加入到你的配置类中,就能恢复之前的行为。

2. 适配DefaultTokenServices(标准资源服务场景)

如果你的应用可以切换到标准的OAuth2资源服务模式,需要为DefaultTokenServices配置必要的依赖组件,比如令牌存储(TokenStore)、客户端详情服务(ClientDetailsService)等。以JWT令牌场景为例,配置示例如下:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    // 从配置文件读取JWT公钥
    @Value("${security.oauth2.resource.jwt.key-value}")
    private String jwtPublicKey;

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        // 指定自定义的tokenServices
        resources.tokenServices(customTokenServices());
    }

    @Bean
    public ResourceServerTokenServices customTokenServices() {
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setTokenStore(jwtTokenStore());
        tokenServices.setSupportRefreshToken(true);
        // 如果需要验证客户端信息,可配置ClientDetailsService
        // tokenServices.setClientDetailsService(clientDetailsService());
        return tokenServices;
    }

    @Bean
    public TokenStore jwtTokenStore() {
        return new JwtTokenStore(jwtAccessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        // 设置JWT验证公钥
        converter.setVerifierKey(jwtPublicKey);
        return converter;
    }
}

这种方案更符合Spring Security OAuth2的原生设计,适合不需要依赖用户信息端点的资源服务场景。

补充说明

Spring Boot 2.0正式版发布后,OAuth2的自动配置逻辑又做了进一步的梳理和稳定,建议你后续尽量使用正式版而非里程碑版本,避免频繁的配置变更。

内容的提问来源于stack exchange,提问作者posthumecaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:40:38