授权服务如何在基于角色的微服务架构中实现所有权检查

时间:2017-09-27 17:34:28

标签: architecture authorization microservices soa

假设我在博客应用上有三种类型的用户

  1. 作者(能够修改自己的帖子,但不能修改其他帖子)
  2. 管理员(能够修改所有帖子)
  3. 读者(无法修改任何帖子)
  4. 要管理这个系统,我希望有三个主要服务:

    • API网关,公开客户端将消耗的所有API,根据需要组合服务。
    • 帖子管理服务,提供博客帖子的CRUD操作(包括谁拥有哪些帖子的数据)
    • 授权服务,用于存储角色和权限,公开一个API,该API包含一系列角色(请求用户拥有的角色)和一组权限(访问API所需的权限)并确定那些输入的角色是否涵盖所有输入的权限。

    现在我正在努力的是资源的所有权(以及应该检查所有权的地方)。

    如果不与其他服务通信,授权服务如何确定用户是否应该能够访问他们拥有的内容而不知道如何确定用户是否拥有给定资源。

    我已经为这个问题想出了一些不同的解决方案,虽然我对它们中的任何一个都不满意。

    1. API网关将查询管理帖子的其他服务,以确定请求用户是否拥有他们尝试访问的帖子,这意味着在授权服务之外会发生授权逻辑。
    2. 服务管理博客帖子将根据所有权处理授权,这也意味着在授权服务之外发生授权逻辑,以及未经授权的请求最初被标记为授权的事实(因为他们仍将通过授权服务)
    3. 授权服务可以获知如何检查所有权,必须能够告知API是否应该检查所有权以及权限。这会增加授权服务的复杂性并增加跨服务通信,我希望尽可能地将其降级​​到API网关,因为它应该是主服务组合器。
    4. 寻找有关替代方法的想法或深入了解此问题的最佳解决方案。

3 个答案:

答案 0 :(得分:0)

由于它是外部化的,授权服务应尽可能“愚蠢”。有时,基于业务逻辑和数据的“授权”可能变得非常复杂。我认为业务逻辑属于负责管理它的服务。此外,API网关可能还需要为客户端提供所有权状态(来自管理这些博客帖子的服务?),以便客户端可以知道要公开的内容。因此,保持授权简单,并封装更复杂的业务检查,以查看可以在服务本身内完成的任务。

另一种方法是加强授权服务以获取另一个参数,在这种情况下为所有权状态。 API网关或其他服务检查授权(Blog Post Manager?)可以首先从了解所有权业务的服务获取所有权状态,然后使用提供角色和所有权状态的授权服务。权限规则(可选)基于角色和真/假指示符。授权服务不知道true / false意味着什么,只是为角色“Reader”+指示符= true授予权限“编辑帖子”,对角色“管理员”+指示符= false 角色“管理员”+指标=真等等。

答案 1 :(得分:0)

在我看来,你正在努力,因为你一次都没有所需的所有信息。

为什么不使用JWT(JSON Web令牌)?

他们可以存储有效负载(例如用户权限,权限等),您可以轻松检查他们声称的内容是否属实。

https://auth0.com/learn/json-web-tokens/

答案 2 :(得分:0)

我想以此为契机来记录我们用来为微服务提供基于声明的授权的方法。

通常,对资源的访问基于资源的所有权。例如,代表保险报价的资源。要访问保险报价,您必须是报价的用户。

我们的方法是使用以下路径通过网关公开/ quotes资源:

GET /quotes/{quoteId}

但要使报价微服务将用户ID引入报价资源路径中,如:

GET /quotes/{userId}/{quoteId}

这允许报价微服务在用户上下文中搜索报价,如果此路径无效,则返回404。

为了启用此体系结构,网关需要基于呼叫者的承载令牌收集呼叫者的声明,并将userId声明的值注入到下游路径中。如下图所示:

enter image description here

这种基于所有权的访问方法可以很容易地扩展为包括其他声明(例如行政声明等)。