【发布时间】:2017-12-09 16:56:34
【问题描述】:
目前我开发了一个基于微服务架构的后端。 不幸的是,我有一个如何实现授权的问题。
让我解释一下我的系统 - 有以下服务:
- OAuth 2.0 服务(颁发 JWT)
- 团体服务
- 一些资源服务(例如 ToDos 服务)
每个用户都属于一个或多个组。 每个资源(如 ToDo 列表)也属于一个组。 这意味着如果某个用户创建了一个待办事项列表,该列表将存储在该组的名称中。
情景:
- 用户 A 在 A 组中
- 用户 B 在 A 组和 B 组中
- 用户 C 在 C 组中
- 用户 A 在组 A 中创建一个 ToDo 列表。
- 用户 B 修改了这个 ToDo 列表(他可以这样做,因为他也在 A 组中)
- 用户 C 也尝试修改此 ToDo 列表,但不应允许他这样做,因为他只在 C 组中。
有没有人知道如何在微服务架构中实现这一点并将服务之间的依赖关系保持在最低限度?
当然,如果用户在资源所属的组中,我可以在每次请求时询问组服务。但是所以我在资源服务和组服务的存在之间得到了一个非常严重的依赖关系——我喜欢避免这种依赖关系。 另一种选择是将用户所属的所有组存储在访问令牌中。但是使用此选项,当用户获得新组的成员时,客户端每次都必须向 OAuth 服务询问新令牌。
那么我还有其他选择如何实现这个场景吗?
【问题讨论】:
-
通过将依赖关系保持在最低限度,我想您希望您的系统更具弹性,即如果授权 MS 失败,那么 ToDos MS 应该继续工作,我是这样写的吗?
-
是的,这是一回事。但这并不是真正的问题。这可以通过水平扩展组服务轻松解决。相反,我喜欢抑制这两个服务之间的完全依赖关系。
-
完全移除依赖是不可能的。
-
另外,水平缩放并不能解决级联故障。
-
相反,我喜欢抑制这两个服务之间的完全依赖关系,并尽可能降低服务之间的通信 - 这样我可以获得更高的速度 - 服务不必每次组服务时都询问如果用户是该组的成员。所以我的问题是朝那个方向发展的,我想知道这是否可以通过另一种方式解决。我应该在每个依赖于组的资源服务器上保存一些成员信息吗?或者是否有另一种可能的机制来获得授权在这种情况下工作?
标签: scope authorization microservices