Spring Authorization Server 1.0.0中ClientDetails接口及方法的替代方案咨询
在Spring Authorization Server 1.0.0中,原ClientDetails接口的getAdditionalInformation()方法的标准替代是RegisteredClient的metadata字段——这是符合OAuth 2.1/OpenID Connect规范的客户端自定义信息存储方式,完全适配业务场景下的额外信息需求,而非使用clientSettings(后者仅用于存储框架级配置项,如授权同意开关、PKCE要求等)。
具体实现步骤
构建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();获取额外信息
在需要使用额外信息的场景(如自定义授权页面、令牌增强器、客户端认证逻辑等),通过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; }; }持久化支持
若使用官方提供的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
相关产品推荐
相关产品推荐

