我正在构建我的第一个基于微服务的系统,但有一些事情我无法理解。在此之前,我先简单介绍一下该应用程序,以便为大家提供一些背景信息。
系统分为很多模块,例如我们有一个Project模块,用于管理项目、任务、子任务等。另一个模块是Library模块,用于处理文件、文件夹、上传文件、下载文件等。
我们还有另一个重要的模块来处理系统中的用户。此外,该模块还负责处理部门。简而言之,该模块处理用户的增删改查、部门的增删改查以及用户与部门的关联(例如,将用户 A 添加到部门 B 或让用户 B 成为部门 c 的经理)。值得一提的是,部门是有层级的;即,一个部门可以有一个父部门。
我们计划将其设置为基于微服务的系统的方式如下:
我们遇到的问题与复杂的授权场景有关。简单的授权(例如用户 A 必须拥有权限 B)很简单,因为我们将在 JWT 令牌中包含用户的所有权限。然而,更复杂的有点棘手。
对于上下文,这里有一个示例:假设在项目微服务中,用户创建项目 A。假设项目 A 分配给部门 B。我们还假设要使项目处于活动状态,它必须需经过以下一系列审批:
值得注意的是,对于步骤1,如果B部门没有经理,系统应该上一级检查是否有经理,并将请求转发给他们。类似地,在步骤 2 和 3 中,如果没有直接上级部门,则系统应查找层次结构,直到找到最接近经理的部门并将请求转发给他们。如果没有找到经理,则请求应立即转到步骤 4。
现在,这个逻辑很容易在整体系统中实现(我们之前已经这样做过)。然而,这里的挑战是项目微服务没有必要的信息(基本上是用户部门关联)来弄清楚这个流程(它需要的信息托管在身份微服务中)。
我在这里能想到的唯一解决方案是将用户/部门/用户部门关联复制到所有其他微服务中(项目微服务并不是唯一存在此问题的微服务)。此外,我们不想在微服务之间引入任何同步通信来减少它们之间的耦合。这是一个健全的解决方案吗?或者还有其他更好的方法来处理这个问题吗?
我们遇到的问题与复杂的授权场景有关。简单的授权(例如用户 A 必须拥有权限 B)很简单,因为我们将在 JWT 令牌中包含用户的所有权限。然而,更复杂的有点棘手。
基于此,您的问题看起来像是 ReBAC 的完美候选者。这个想法是返回授权决策的中央微服务。
市场上有几种实现这种方法的解决方案,包括开源的和商业的。
免责声明:我目前是正在构建此类解决方案的团队的一员。