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

Ben*_*ars 5 architecture soa authorization microservices

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

  1. 作者(能够修改自己的帖子,但不能修改其他人)
  2. 管理员(能够修改所有帖子)
  3. 阅读器(无法修改任何帖子)

要管理此系统,我要提供三项主要服务:

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

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

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

我对这个问题提出了几种不同的解决方案,尽管我对它们都不满意。

  1. API网关将查询管理帖子的其他服务,以确定请求用户是否拥有他们尝试访问的帖子,这意味着授权服务之外会发生授权逻辑。
  2. 服务管理博客帖子将基于所有权处理授权,这也意味着授权逻辑正在授权服务之外发生,以及未经授权的请求最初被标记为已授权的事实(因为它们仍将通过授权服务)
  3. 可以为授权服务提供有关如何检查所有权的知识,必须能够告知API是否应连同权限一起检查所有权。这将增加授权服务的复杂性,并增加跨服务通信,我希望将其尽可能多地委托给API网关,因为它应该是主要的服务编写者。

寻找关于替代方法的想法,或者洞悉解决此问题的最佳解决方案。

Ger*_*tha 0

由于它是外部化的,授权服务应该尽可能“愚蠢”。有时基于业务逻辑和数据的“授权”可能会变得非常复杂。我认为业务逻辑属于负责管理它的服务。此外,API 网关可能需要向客户端提供所有权状态(通过管理这些博客文章的服务?),以便客户端知道要公开什么。因此,请保持授权简单,并封装更复杂的业务检查,以查看服务本身可以做什么。

另一种方法是增强授权服务以采用另一个参数,在本例中是所有权状态。API网关或其他检查授权的服务(Blog Post Manager?)可以首先从了解所有权业务的服务获取所有权状态,然后使用提供角色和所有权状态的授权服务。权限规则将(可选)基于角色和真/假指示器。授权服务不知道 true/false 的含义,只是为角色“Reader”+ Indicator=true 和角色“Administrator”+ Indicator=false 或角色“ Administrator ”+ 授予权限“Edit Post”指标=真等