适应此安全系统以处理多重继承的最佳方法是什么?

jho*_*orn 9 theory security tree symfony

束缚自己,这是一个棘手的问题.

我们有一个处理大数据集的系统.(每张桌子有数百万到十亿的记录).所有数据都在节点的树结构中处理.

我们正在使用Symfony2和Symfony2安全系统(Domain Objects,Acls,Aces等).我们的Acl树镜像我们的节点树.

硬币一些语言:

  • DP 定义的权限,即此acl节点上的ace记录
  • EP 有效权限,没有ace记录,从父级继承的权限 DP

业务逻辑上,我们为每个用户的对象分配0或1个ace,并且在没有的情况下依赖继承. Root > lvl1 (DP: VIEW) > lvl2 > lvl3 (EP: VIEW)

到现在为止还挺好.这一切都有效.

一些节点不仅具有父节点,而且与其他节点(多对多节点)相关联.当一个节点与另一个节点相关联时,这表示树上的一个单独路径,供acls遵循.IE我们将有一条或多条路径从树到根以收集ace.

Leaf < Parent < GrandParent < Root
Leaf < AssociatedNode < AssociatedNodeParent < AssociatedNodeGrandParent < Root
 ...
Run Code Online (Sandbox Code Playgroud)

或者用于管理aces投票的逻辑很好,我们不确定的是如何表示树上的多个路径.我们当前(读:坏)的想法是:

  • acl树中的多个父行为
    • 优点
      • 看起来更干净?
    • 缺点
      • 几乎整个安全系统的重写都要把它放进去.
      • 潜在的大鼠.
  • 针对实体的重复对象标识/ acls,指定不同的父项.
    • 优点
      • 呃......
    • 缺点
      • 将潜在地创建非常大量的acl记录.
      • 难以管理代码.

MrG*_*mez 1

在您的多父案例中,您实际上有一个从初始节点到任何包含 ace 的节点的逆树遍历。因此,如果我们将向上和侧面遍历操作可视化为它们自己的树(修剪循环),那么在最坏的情况下,您可以在找到王牌之前搜索整个节点网络。

解决这个问题的最简单方法是保证某种形式的堆属性,以确保每个带有 ace 的节点都具有可以驱动遍历的大或小值。O(n)这可以将最坏情况(如果您搜索数据库索引中的每个节点)的遍历时间缩短到O(log n)通过网络反向路径时的遍历时间。

这里之所以O(1)难以遍历,是因为你的节点网络保证了环路的可能性。但是,如果您构建一个 ACL 图来维护最小堆等属性,那么应该没问题。

祝您的权限模型好运。