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

时间:2018-04-02 13:58:40

标签: jwt microservices

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

让我们说我的主要应用程序包含6个模块:

  • 客户端
  • 网关
  • AUTH-服务
  • 论坛
  • 消息

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

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

为了说明我的一些麻烦,我创建了一个序列图: this image shows the sequence diagram, which I am having trouble with

Click here如果您愿意,可以使用原始的draw.io图形。

我不想使用任何第三方授权服务;我只想要我的auth-service(已经完成了)来注册用户并让他们登录。或者我应该在该服务中管理权限和角色吗?

我试图围绕这个问题包围我好几个月,但我根本找不到合适的结构,所以我可以让用户注册,登录/注销并与各种生产服务进行通信。我目前正在使用Java作为后端的东西,但微服务的好处是,我不必为它们使用一种编程语言。

欢迎任何帮助!

P.s。:我读过Microservice Authentication strategyZuul - Api Gateway Authentication,但两者似乎都不适用于我的情况。

2 个答案:

答案 0 :(得分:5)

我使用以下设置,效果很好:

登录流程:

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

正常运行:

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

注销流程:

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

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

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

答案 1 :(得分:2)

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

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

如果您需要更精细的方法,则需要在模块级别进行。通常,在微服务体系结构中,每个服务都将调用另一个服务,并且在模块级别具有授权设置可以避免预先了解网关api所需的所需权限。而且您可以部署这些模块中的每个模块而无需考虑其他服务,在方法级别上具有精细的权限等。