为啥 Spring Security OAuth2 DefaultTokenServices 在加载身份验证时检查 clientId?

Posted

技术标签:

【中文标题】为啥 Spring Security OAuth2 DefaultTokenServices 在加载身份验证时检查 clientId?【英文标题】:Why do Spring Security OAuth2 DefaultTokenServices check clientId on loading the Authentication?为什么 Spring Security OAuth2 DefaultTokenServices 在加载身份验证时检查 clientId? 【发布时间】:2015-01-04 14:27:23 【问题描述】:

DefaultTokenServices为什么在方法loadAuthentication中检查clientId

    if (clientDetailsService != null) 
        String clientId = result.getOAuth2Request().getClientId();
        try 
            clientDetailsService.loadClientByClientId(clientId);
        
        catch (ClientRegistrationException e) 
            throw new InvalidTokenException("Client not valid: " + clientId, e);
        
    

上面是问题,下面只是一些背景来解释我为什么想出它。我问的原因是一个特殊的场景:如果授权服务器不对所有客户端负责,但资源服务器在同时作为资源服务器和授权服务器的 Spring Boot 应用程序中,检查会带来问题必须为所有客户服务。

在纯资源服务器上,clientDetailsS​​ervice 可以为空。资源服务器可以在不知道注册客户端的情况下工作,而安全性仍然可以在访问令牌的其他属性上实施,例如资源 ID 和访问令牌的有效性。

在纯 Authorization Server 上没有问题,因为 Authorization Server 必须有一个 clientDetailsS​​ervice,它知道可以为其颁发令牌的所有客户端。

然而,在混合服务器上,授权服务器可能不知道所有可能的客户端,因为可能存在其他授权服务器。然后,资源服务器组件将检查上述代码中的每个 clientId,并拒绝来自此授权服务器不知道的客户端的所有请求。

使场景易于理解的示例:

    有一个混合服务器(授权和资源服务器合二为一),它为业务用户颁发令牌并为管理业务用户提供服务(例如创建、锁定、解锁等)。

    还有一个单独的授权服务器为管理用户颁发令牌。管理用户使用 UI 来管理(例如创建、锁定、解锁等)业务用户,即他们使用 1. 的服务和 2 发行的令牌。

【问题讨论】:

【参考方案1】:

我想我并没有真正遵循需要隔离客户端的逻辑。无论如何,我不认为资源服务器和授权端点必须共享相同的*TokenServices(它们甚至不使用相同的接口)。

【讨论】:

以上是关于为啥 Spring Security OAuth2 DefaultTokenServices 在加载身份验证时检查 clientId?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Oauth2

Spring-Security OAuth2 设置 - 无法找到 oauth2 命名空间处理程序

Spring Security OAuth2 v5:NoSuchBeanDefinitionException:'org.springframework.security.oauth2.jwt.Jwt

针对授权标头的Spring Security OAuth2 CORS问题

OAuth2.0学习(4-1)Spring Security OAuth2.0 - 代码分析

Spring Security---Oauth2详解