每个微服务都应该管理自己的用户权限和用户角色吗?

Igo*_*gor 7 jwt microservices

我有一个设计问题,不确定如何解决。

假设我的主要应用程序包含6个模块:

  • 客户
  • 网关
  • 认证服务
  • 论坛
  • 画廊
  • 讯息

客户端应该只与网关服务通信。

我是否应该让网关进行用户身份验证(理想情况下会导致JWT)和其他3种生产服务(论坛,画廊,消息)仅验证令牌并检索给定用户自己管理的权限和角色?

为了说明我的一些麻烦,我创建了一个时序图: 此图显示了序列图,我遇到了麻烦

如果愿意,请单击此处获取原始的draw.io图形。

我不想使用任何第三方身份验证服务;我只希望我的身份验证服务(已完成)注册用户并让他们登录。还是应该在该服务中管理权限和角色?

我花了几个月的时间来解决这个问题,但是我根本找不到合适的结构,因此我可以让用户注册,登录/注销并与各种生产性服务进行通信。我目前正在使用Java作为后端工具,但是关于微服务的好处是,我不必全部使用一种编程语言。

欢迎任何帮助!

附:我阅读了微服务认证策略Zuul-Api网关认证,但是这两种方法似乎都不适用。

inq*_*ive 9

我已经使用了以下设置,并且效果很好:

登录流程:

  1. 全新的浏览器请求特定资源
  2. 网关服务检测到缺少jwt cookie并重定向到登录表单
  3. 登录表单通过网关与auth-service对话。网关仅允许非jwt调用身份验证服务
  4. 身份验证服务为登录表单提供一个新创建的jwt cookie并重定向到原始URL

普通手术:

  1. 浏览器与jwt cookie一起请求资源
  2. 网关服务拦截请求并将jwt转发到auth-service进行验证
  3. 身份验证服务先检查签名,然后再时间戳,然后将其列入黑名单,并返回肯定或否定结果
  4. 如果为肯定,则网关服务将请求转发到相应的后端服务,否则重定向到登录
  5. 后端服务不执行jwt验证-它仅信任网关仅发送有效请求。
  6. 后端服务确实检查jwt中定义的角色/权限/权利

注销流程:

  1. 浏览器向auth-service /登出请求
  2. 身份验证服务将jwt放入黑名单并重定向到登录表单

现在,这是我们无需任何(很多)第三方帮助就实现的简单工作流程。在某些时候,我们确实必须使用会话cookie,但这是出于其他原因。请注意,除了auth服务中的黑名单外,系统几乎是无状态的。一个不只是用jwt注销!我们有一个REDIS来管理黑名单。您可以在网关或身份验证服务处使用会话Cookie进行注销。

大多数后端服务在jwt中都希望有自己的一组角色/特权/权利。角色由auth服务授予用户,并写入授予的jwt中。如果将新角色分配给用户,则该用户必须注销/登录以反映该特权。如果删除了某些特权,则用户必须强制注销-这就是REDIS播放的位置。


skj*_*ini 5

这取决于权限设置的复杂程度。

如果您的权限非常简单,即所有服务都需要身份验证并且只有一个角色可以使用,您可以在网关 api 处添加。

如果您需要更细粒度的方法,则需要在模块级别进行。通常在微服务架构中,每个服务都会调用另一个服务,并且在模块级别进行授权设置可以避免预先了解网关 api 所需的所需权限。并且您可以在不考虑其他服务的情况下部署这些模块中的每一个,在方法级别拥有细粒度的权限等。