【问题标题】:Authorization with: dynamic groups, permission based content lists, micro-services based architecture?授权:动态组、基于权限的内容列表、基于微服务的架构?
【发布时间】:2019-09-20 19:49:29
【问题描述】:

我不确定 Spring Security / Spring Cloud 是否对我的授权需求有用。 这是我的用例:

  • 我有一个类似 CMS 的应用程序。
  • 可以将内容分配给一个或多个“组”
  • 如果该用户属于至少一个组,则该用户可以查看该内容。
  • 重要提示:这些组不是硬编码的!通过 Web 应用程序,用户可以(在运行时)创建新的自定义组,因此组和用户位于数据库表中。

示例:将内容分配给以下组:“德国”、“瑞典”、“程序员”、“经理”。

  • 来自德国的经理可以阅读该内容
  • 来自法国的经理可以阅读该内容(他至少是一名经理)
  • 一位来自法国的 UX 设计师无法阅读该内容。

为了管理访问单个内容的权限,检查很简单!

我最大的问题是列出允许用户查看的内容。目前我通过 SQL 查询来管理它。我将内容加入到他们分配的组中,然后我使用这种 SQL 来过滤内容:

... WHERE ... group IN  [[list of groups associated to the authenticated user]]

为了防止性能问题,这些查询结果被缓存了。

当我在这些内容中添加“数据”时,问题似乎更糟了,让我们想象一下这些内容可以被评论。我只想列出用户有权查看的评论。

规则很简单,如果允许查看其父内容,则可以阅读评论。

再次,如果我想检查用户权限以查看单个评论,检查很简单,但如果我想列出 cmets,事情就比较困难了。

最后,如果我想采用基于微服务的架构,那么 cmets 将由不同的服务管理(不是吗?)。但是为了列出允许用户查看的 cmets,我需要再次提供所有“用户和组”信息,因此基于微服务的架构似乎不太合适。

我的设计方法完全错了吗?

非常感谢。

【问题讨论】:

    标签: java design-patterns spring-security authorization spring-cloud


    【解决方案1】:

    您需要 Spring Security 与访问控制列表 (Spring Security ACL) 相结合,这是基于域对象安全权限的最细粒度的用户权限。

    使用 ACL,您可以将权限分配给特定数据(相当于数据库中的一行,以便相互理解),例如读取或写入,您还可以分配给用户或组。

    带有 ACL 的 Spring Security 涵盖了您描述的所有场景,您可以在 start here 找到一个示例

    cmets 将由不同的服务管理(不是吗?)

    这取决于你,这取决于你的场景

    但为了列出允许用户查看的 cmets,我需要 再次查看所有“用户和组”信息,

    当然!当您过滤信息时,您需要了解具有相关组/角色的登录用户

    ,所以基于微服务的架构似乎不太合适。

    为什么?您经常需要用户信息(如果您有用户,您可以在需要时读取相关数据),这也发生在微服务中。您需要将用户信息在一个微服务之间传输到另一个微服务(例如使用 JWT)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2012-05-07
      • 2015-01-18
      • 2021-09-14
      • 1970-01-01
      相关资源
      最近更新 更多