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

时间:2016-12-05 03:42:29

标签: architecture microservices

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

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

Firewall Pattern

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

用户

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

酒店

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

房间

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

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

要知道 X 是否有权编辑 Y ,我必须向酒店服务部门提出要求" Y 该酒店与(拥有/雇用) X 相关联?"。

问题是:我在哪里提出这些要求?
让网关询问酒店服务,然后将客户请求转发给客房服务,或让客房服务询问酒店服务

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

1 个答案:

答案 0 :(得分:9)

TL; DR;您的问题是您基本上将数据模型转换为服务。这是错误的,而不是你如何建模微服务架构。 与数据模型无关,与功能相关。 (我基于你构思问题的方式,你不谈论功能和责任,你谈论关系)。

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

关于身份验证和授权

  

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

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

其次,即使您可以通过客房服务要求酒店进行授权,但如果客房服务自行完成或致电其他负责提供授权的服务(即授权服务),则会更好。

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

为何模型错误

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

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

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

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

如果您的操作类似于"注册新房间,将照片添加到房间,从房间移除照片,预订房间等等,您只需拥有后端即可获得更好的效果使用简单的API进行服务,允许您执行所有这些简单的操作。老实说,酒店管理系统似乎不是使用微服务架构构建的正确应用程序。说实话,这更像是传统的MVC模式。

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

注意我们现在有两个或三个可能的客户:   - 您管理酒店的前端。   - 您的预留房间的前端。   - 你的客房服务到搜索室的前端有人吗?

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

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

因为现在您拥有匿名用户(或来自系统外的用户),再也无法访问酒店服务(毕竟用户不再需要管理酒店)那么为什么酒店服务会知道?。

现在,您将如何处理系统用户?每个微服务会有不同的用户吗?或者是否会有一个在所有微服务中共享的用户?可能是后者,所以提示另一个服务进行身份验证(或者你可以使用oauth2,如果它适合你的模型,那就是一个验证人的服务)。

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