假设我在博客应用上有三种类型的用户
要管理这个系统,我希望有三个主要服务:
现在我正在努力的是资源的所有权(以及应该检查所有权的地方)。
如果不与其他服务通信,授权服务如何确定用户是否应该能够访问他们拥有的内容而不知道如何确定用户是否拥有给定资源。
我已经为这个问题想出了一些不同的解决方案,虽然我对它们中的任何一个都不满意。
寻找有关替代方法的想法或深入了解此问题的最佳解决方案。
答案 0 :(得分:0)
由于它是外部化的,授权服务应尽可能“愚蠢”。有时,基于业务逻辑和数据的“授权”可能变得非常复杂。我认为业务逻辑属于负责管理它的服务。此外,API网关可能还需要为客户端提供所有权状态(来自管理这些博客帖子的服务?),以便客户端可以知道要公开的内容。因此,保持授权简单,并封装更复杂的业务检查,以查看可以在服务本身内完成的任务。
另一种方法是加强授权服务以获取另一个参数,在这种情况下为所有权状态。 API网关或其他服务检查授权(Blog Post Manager?)可以首先从了解所有权业务的服务获取所有权状态,然后使用提供角色和所有权状态的授权服务。权限规则(可选)基于角色和真/假指示符。授权服务不知道true / false意味着什么,只是为角色“Reader”+指示符= true授予权限“编辑帖子”,对角色“管理员”+指示符= false 或角色“管理员”+指标=真等等。
答案 1 :(得分:0)
在我看来,你正在努力,因为你一次都没有所需的所有信息。
为什么不使用JWT(JSON Web令牌)?
他们可以存储有效负载(例如用户权限,权限等),您可以轻松检查他们声称的内容是否属实。
答案 2 :(得分:0)
我想以此为契机来记录我们用来为微服务提供基于声明的授权的方法。
通常,对资源的访问基于资源的所有权。例如,代表保险报价的资源。要访问保险报价,您必须是报价的用户。
我们的方法是使用以下路径通过网关公开/ quotes资源:
GET /quotes/{quoteId}
但要使报价微服务将用户ID引入报价资源路径中,如:
GET /quotes/{userId}/{quoteId}
这允许报价微服务在用户上下文中搜索报价,如果此路径无效,则返回404。
为了启用此体系结构,网关需要基于呼叫者的承载令牌收集呼叫者的声明,并将userId声明的值注入到下游路径中。如下图所示:
这种基于所有权的访问方法可以很容易地扩展为包括其他声明(例如行政声明等)。