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

Spring Authorization Server 1.0.0中ClientDetails接口及方法的替代方案咨询

Spring Authorization Server 1.0.0 中 ClientDetails.getAdditionalInformation() 的替代方案

在Spring Authorization Server 1.0.0中,原ClientDetails接口的getAdditionalInformation()方法的标准替代是RegisteredClient的metadata字段——这是符合OAuth 2.1/OpenID Connect规范的客户端自定义信息存储方式,完全适配业务场景下的额外信息需求,而非使用clientSettings(后者仅用于存储框架级配置项,如授权同意开关、PKCE要求等)。

具体实现步骤

  1. 构建RegisteredClient时添加额外信息
    使用RegisteredClient.Builder提供的metadata()方法(支持单个键值对或批量Map)来添加自定义额外信息:

    import org.springframework.security.oauth2.core.AuthorizationGrantType;
    import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
    import java.util.UUID;
    
    RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
            .clientId("your-client-id")
            .clientSecret("{bcrypt}your-encoded-secret")
            .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
            .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
            .redirectUri("https://your-app.com/callback")
            .scope("user:read")
            .scope("user:write")
            // 添加单个自定义额外信息
            .metadata("client-type", "web-app")
            .metadata("allowed-domains", new String[]{"your-domain.com", "sub.your-domain.com"})
            // 或批量添加
            // .metadata(Map.of("key1", "value1", "key2", "value2"))
            .build();
    
  2. 获取额外信息
    在需要使用额外信息的场景(如自定义授权页面、令牌增强器、客户端认证逻辑等),通过RegisteredClient.getMetadata()方法获取:

    // 示例:在令牌增强器中把客户端额外信息加入令牌
    import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
    import org.springframework.security.oauth2.core.OAuth2AccessToken;
    import org.springframework.security.oauth2.server.authorization.token.TokenEnhancer;
    import java.util.HashMap;
    import java.util.Map;
    
    @Bean
    public TokenEnhancer clientMetadataTokenEnhancer(RegisteredClientRepository registeredClientRepository) {
        return (accessToken, authentication) -> {
            String clientId = authentication.getName();
            RegisteredClient registeredClient = registeredClientRepository.findByClientId(clientId);
            
            if (registeredClient != null) {
                Map<String, Object> enhancedInfo = new HashMap<>(accessToken.getAdditionalInformation());
                // 将客户端元数据合并到令牌额外信息中
                enhancedInfo.putAll(registeredClient.getMetadata());
                return new OAuth2AccessToken(accessToken.getTokenType(), accessToken.getTokenValue(),
                        accessToken.getIssuedAt(), accessToken.getExpiresAt(), accessToken.getScopes()) {
                    @Override
                    public Map<String, Object> getAdditionalInformation() {
                        return enhancedInfo;
                    }
                };
            }
            return accessToken;
        };
    }
    
  3. 持久化支持
    若使用官方提供的JdbcRegisteredClientRepository,metadata会自动以JSON格式存储到oauth2_registered_client表的client_metadata字段,无需额外配置。

关键注意点

  • 不要使用clientSettings存储业务自定义信息,ClientSettings的setting()方法仅用于配置框架行为(如requireAuthorizationConsent、requireProofKey等),与原additionalInformation的业务用途完全不符。
  • RegisteredClient.getMetadata()返回的是不可修改的Map,若需要修改可通过new HashMap<>(registeredClient.getMetadata())转为可变Map进行操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:21:27