【发布时间】:2017-12-22 03:03:02
【问题描述】:
与实施无关的讨论。
- 黑线显示哪些服务受身份验证服务器保护。
- 绿线表示服务之间的交互(Customer 和 Orders 服务需要通过 Data 服务才能访问数据库。StandAlone 服务不像其他服务)
- 红线表示特定的请求流程
- 数据服务不直接暴露在外部,只能由允许这样做的其他服务访问。
我假设当用户通过身份验证服务器进行身份验证时,客户端已获得访问令牌。选择了哪个流(隐式、授权码、密码)无关紧要。我想从客户端已经获得访问令牌开始讨论。
从那时起,我很清楚当客户端需要访问单个资源服务器时会发生什么。
- 向资源服务器发出请求并传递获取的令牌
- 资源服务器验证令牌(与方式无关)
- 如果有效,则提供请求。
因此,在该图中,如果客户端要访问“独立服务”(不与任何其他资源服务器对话),那么流程对我来说很清楚。
当客户遵循图中的红线时,我遇到了麻烦。所以我需要访问一个服务(资源服务器),为了回复需要访问另一个服务(也是资源服务器)。在这种情况下流程如何?
场景 1.
- “订单服务”设置为资源服务器和客户端。
- 客户端使用访问令牌发出请求,但“订单服务”将使用自己的客户端凭据获取另一个令牌,以便与“数据服务”通信。
我看到的问题是我失去了用户权限。我将使用“订单服务”权限而不是用户权限执行对“数据服务”的请求。
场景 2。
- “订单服务”仅设置为资源服务器。
- 客户端使用用户令牌发出请求,“订单服务”会将相同的令牌转发到“数据服务”
在这里,我使用用户的权限执行,但现在我看到我的“数据服务”已公开并对任何其他服务开放。 (其实我不知道 oauth2 是否提供了这样的限制。将客户端仅限于特定的资源服务器)
场景 3。
在这里,我看到了上述场景的组合,其中“订单服务”将为数据服务提供两个令牌。用户访问令牌,以便使用正确的权限和“订单服务”客户端访问令牌执行请求,以便我知道允许该服务与“数据服务”对话。
实施
我正在使用 spring boot 和 spring security 来设置上面看到的我的 oauth2 组件。我已经有一个身份验证服务器、一个资源服务器和一个客户端。客户端此时与资源服务器对话,而请求未委托给另一个资源服务器。
根据最佳方法,我将如何在实施方面进行?我需要对我的资源服务器进行哪些更改,以便它们可以安全地相互通信?
感谢您的宝贵时间
【问题讨论】:
标签: security spring-security oauth-2.0 spring-oauth2