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

时间:2012-03-05 03:14:28

标签: security tree symfony theory

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

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

我们正在使用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
 ...

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

  • acl树中的多个父行为
    • 赞成
      • 似乎清洁?
    • 缺点
      • 几乎完全重写了安全系统,以便将其放入。
      • 潜在的大鼠。
  • 针对实体复制对象标识/ acls,指定不同的父级。
    • 赞成
      • 呃......
    • 缺点
      • 可能会创建大量的acl记录。
      • 很难用代码管理。

2 个答案:

答案 0 :(得分:1)

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

解决此问题的最简单方法是保证某种形式的heap property,以确保每个具有ace的节点具有可驱动遍历的大值或小值。这会将遍历时间从最差情况O(n)(如果您搜索数据库索引中的每个节点)降低到O(log n),当您通过网络回溯时。

在这里进行O(1)遍历很困难的原因是您的节点网络保证了循环的可能性。但是,如果你构建一个ACL图来维护例如最小堆的属性,你应该没问题。

祝你的权限模型好运。

答案 1 :(得分:1)

再次,如上所述,这是一个有趣但非平凡的问题 - 谢谢!现在我知道我将如何度过这个周末:-)我也可以考虑堆的想法,但我会把它作为一个线程堆。如果你愿意的话,堆中的每个节点都包含一个指向ACL“索引”的指针。

假设我在示例中只有三个节点(R(oot),P(不是)和N(ode))。因此,为N设置的ACL是ACL(R)+ ACL(P)+ ACL(N)。假设在创建节点时,该节点包含指向节点索引的指针X.所以R(X)= ACLIndex(R)。没有节点本身实际包含它的ACL。

现在,对于一个给定的节点N,我仍然需要在最坏的情况下从根追逐,但我只是跳过一个平坦的索引来做它而不是在树上反弹。如果您可以断言对于给定节点N,只有一条到N的路径,或者如果有多条路径,则N保留另一个遍历表,对于N,Path(N)来自在该表中侦听节点A.实际上,当节点连接到它时,您必须将面包屑留在N中。

我想知道我们是否可以从地理位置借用一个概念。您的小型手持GPS不可能保留从任何点到任何点的所有可能的最短路径路线,并记住交通时间。它欺骗并将地图划分为“平铺”因为你不能同时在地图上,而是你只限于你当前所在的平铺,它只需要从内部计算最短的路径该瓷砖已知存在。一旦你退出,它会加载该瓦片并重复。实际上,我们使用局部性原则来缩小范围。

如果我们使用相同的想法怎么办?对于给定节点,如果将访问树划分为“分片”,则可以预先计算成本或至少更新它们,然后从R到N的路径成本只是分片成本加上路径成本的总和在你当地的碎片。