architecture - 微服务:集中授权与每个服务中的授权

标签 architecture microservices

假设我有一个使用 API 网关构建的微服务系统。

通过网关后的每个请求都必须由身份验证服务(防火墙模式)进行预身份验证

Firewall Pattern

但是授权呢?例如,我在酒店管理系统中有 3 个模型和 3 个服务:

用户

  • 每个用户可以拥有多家酒店

  • 酒店
  • 酒店由单个用户(所有者)所有
  • 每个酒店可以有很多员工(也是一个用户)
  • 酒店可以有很多房间
  • 为简单起见,我们假设员工与酒店所有者拥有相同的权利

  • 房间
  • 一个房间只能属于一个酒店
  • 业主和员工只能编辑他们在
  • 拥有/雇用的酒店的房间

    编辑房间的示例请求 ,经过身份验证后,它将有一个经过验证的声明,声明类似 '我是用户 X' .

    想知道是否 X 拥有编辑权我必须向酒店服务部提出请求,询问“ Y 的酒店是否与(拥有/雇用) X 相关联?”。

    问题是:我在哪里提出这些要求?
    在将客户端请求转发给客房服务之前,让网关询问酒店服务,或者让客房服务自己询问酒店服务。什么时候选择一个?有什么好处?

    此外,这种建模对我来说似乎有点错误。所有这些围绕微服务的关系只会让我的系统变得非常复杂。随着它的增长,我越来越难以可视化服务之间的工作流程。这个问题有解决方案吗?一个使用像 Neo4j 这样的图形数据库的中心化关系服务?

    最佳答案

    TL; 博士;您的问题是您基本上是将数据模型转换为服务。那是错误的,这不是您对微服务架构建模的方式。 这与数据模型无关,而与功能有关 . (我是基于你提出问题的方式,你不谈论功能和责任,你谈论关系)。

    我将快速回答您问题的第一部分,因为我认为您的问题实际上出在您的建模上。

    关于认证授权

    The question is: Where do I make these requests? Have the Gateway ask the Hotel Service before forwarding client request to Room Service, or let the Room Service ask the Hotel Service by itself. When to choose one over another ? What's the benefit ?



    首先,在您的模型中,客房服务是足够的 上下文 实际授权请求。网关没有(也不应该有)足够的信息来判断(网关不应该了解关于房间或酒店或任何东西的任何信息,它的工作是转发请求,而不是解释它们)。

    其次,即使您可以让客房服务向酒店要求授权,但最好由客房服务自己完成或调用其他负责提供授权的服务(即授权服务)。

    但最重要的是,这种微服务架构没有多大意义(正如您所描述的),这就是为什么整个模型使用起来很奇怪。

    为什么型号不对

    这种建模看起来错误的原因是因为它是。

    术语“微”服务的问题在于,人们倾向于关注“微”部分而忘记“服务”部分。关于什么是微服务有不同的看法,但服务是可以自行调用并提供在该服务的多个客户端之间共享的值的东西。

    您的客房服务毫无意义。 您基本上是将数据模型转换为服务。 酒店有房间,因此您可以定义酒店服务和客房服务。那不是微服务的意义......

    在不知道您的特定用户需求的情况下很难判断,但我的直觉是您可能不需要这里的微服务架构。仅仅因为这是最新趋势,你不需要用它解决每一个问题。

    如果您的操作类似于“注册新房间、向房间添加照片、从房间中删除照片、预订房间等”,那么您最好拥有一个带有简单 API 的后端服务,它允许您执行以下操作所有那些简单的操作。老实说,酒店管理系统似乎不是使用微服务架构构建的正确应用程序类型。老实说,这感觉更像是传统的 MVC 模型。

    如果我必须想出一个房间微服务的用例,我会说你可能想要一个知道所有酒店的所有房间的房间服务。房间可以由酒店注册、编辑和更改。任何人都可以获得所有可用房间的列表,按可用日期过滤,按床数过滤等。

    请注意,我们现在有两个或三个可能的客户端:
    - 您管理酒店的前沿。
    - 您搜索房间的前沿。
    - 别人的前台为您提供客房服务来搜索房间??。

    另请注意,我们已将系统从酒店管理系统更改为可用于查询不同酒店的免费房间的系统......很有用,但用户需求完全不同。

    所以现在你的服务实际上是有意义的......然后碎片将开始失败。

    因为现在你有匿名用户(或来自系统外部的用户),去酒店服务没有意义了(毕竟用户不再需要管理酒店了)那么为什么酒店服务会知道?.

    现在,您将如何处理系统用户?每个微服务会有不同的用户吗?或者是否会有一个用户在所有微服务之间共享?可能是后者,这样就暗示了另一个用于身份验证的服务(或者,如果这适合您的模型,您可以使用 oauth2,这正是对人员进行身份验证的服务)。

    您将如何管理您的权限(您的授权),您想要授权的中央配置还是每个微服务都有自己的配置?如果是前者,那么您可能需要另一个为每个微服务提供授权的服务。

    关于architecture - 微服务:集中授权与每个服务中的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40966759/

    相关文章:

    architecture - 多语言编程 : Is building applications with multiple languages a good practice?

    postgresql - Kubernetes:数据库和数据库用户

    domain-driven-design - 订单和库存 DDD - 应该在哪里处理分配/保留?

    spring-boot - 使用 Zuul 作为认证网关

    docker - 自动化微服务负载平衡/缩放

    java - 为微服务设置 Artifactory

    model-view-controller - 使用 MVC 的多表模型?

    c - C 函数的内存布局

    database - 谷歌 BigQuery 底层架构

    c++ - x86 架构的内存排序限制