Security 调整此安全系统以处理多重继承的最佳方式是什么?

Security 调整此安全系统以处理多重继承的最佳方式是什么?,security,tree,symfony,theory,Security,Tree,Symfony,Theory,系上安全带,这是个棘手的问题 我们有一个处理大数据集的系统。(每个大表有百万到十亿条记录)。所有数据都在节点的树结构中处理 我们正在使用Symfony2和Symfony2安全系统(域对象、ACL、ACE等)。我们的Acl树镜像了我们的节点树 要创造某种语言: DP定义的权限,即此acl节点上的ace记录 EP有效权限,无ace记录,从具有DP 就业务逻辑而言,我们为每个用户分配0或1个ace给一个对象,并在没有ace的情况下依赖继承根目录>lvl1(DP:VIEW)>lvl2>lvl3(EP

系上安全带,这是个棘手的问题

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

我们正在使用Symfony2和Symfony2安全系统(域对象、ACL、ACE等)。我们的Acl树镜像了我们的节点树

要创造某种语言:

  • DP
    定义的权限,即此acl节点上的ace记录
  • EP
    有效权限,无ace记录,从具有
    DP
就业务逻辑而言,我们为每个用户分配0或1个ace给一个对象,并在没有ace的情况下依赖继承<代码>根目录>lvl1(DP:VIEW)>lvl2>lvl3(EP:VIEW)

到目前为止,一切顺利。这一切都有效

某些节点不仅具有父节点,而且与其他节点(多对多)关联。当一个节点与另一个节点关联时,这表示ACL在树上的单独路径。例如,我们将有1条或多条路径沿着树到根,以收集ace

Leaf < Parent < GrandParent < Root
Leaf < AssociatedNode < AssociatedNodeParent < AssociatedNodeGrandParent < Root
 ...
Leaf
或者管理ACE投票的逻辑很好,但我们不确定的是如何表示树上的多条路径。我们目前(读作:坏)的想法是:

  • acl树中的多父行为
    • 专业人士
      • 看起来更干净
    • 缺点
      • 几乎整个安全系统的重写都是为了把这个放进去
      • 潜在的老鼠刺
  • 针对实体复制对象标识/ACL,指定不同的父对象。
    • 专业人士
    • 缺点
      • 将潜在地创建大量acl记录
      • 在代码中很难管理

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

解决这个问题的最简单方法是保证某种形式的a,确保每个具有ace的节点都有一个可以驱动遍历的大小值。这将使遍历时间从最坏的情况
O(n)
(如果搜索数据库索引中的每个节点)下降到
O(log n)

这里很难获得
O(1)
遍历的原因是节点网络保证了循环的可能性。但是,如果您构建一个ACL图来维护(例如)min heap的属性,您应该可以


祝您的权限模型好运。

同样,正如前面提到的,这是一个有趣但不平凡的问题——谢谢!现在我知道我该如何度过这个周末:-我可能会考虑堆的想法,但我会把它变成一个线程堆。如果愿意,堆中的每个节点都包含一个指向ACL“索引”的指针

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

现在,对于给定的节点N,在最坏的情况下,我仍然必须从根开始追踪,但我只是在一个平面索引周围跳跃来完成,而不是在整个树上跳跃。如果您可以断言,对于给定的节点N,只有一条到N的路径,或者,如果有多条路径,N保留另一个遍历表,这样,对于N,来自节点a的路径(N)在该表中被侦听,则会更好。实际上,当节点连接到面包屑时,必须将面包屑保留在N中

我想知道我们是否可以借用地理定位的概念。这是不可能的,你的小手持式GPS保持所有可能的最短路径路线从任何一点到任何一点,并保持交通时间铭记在心。它欺骗地图并将其划分为“分幅”,因为您不能同时在整个地图上,但是,您仅限于当前所在的分幅,它只需要计算从该分幅内到其已知存在的最短路径。一旦您退出,它将加载该磁贴并重复。实际上,我们使用局部性原则来缩小范围


如果我们用同样的想法呢?对于给定节点,如果将访问树划分为“碎片”,则可以预先计算成本或至少更新成本,然后从R到N的路径成本就是碎片成本加上本地碎片中的路径成本之和

恐怕我对你的问题没有答案,但如果你把它整理好,我会非常感兴趣地阅读你是如何做到的:-)我没有从你的问题中得到的是为什么每个节点都没有获得权限(例如,从父节点继承来的权限?)。更重要的是,为什么首先需要通过ACL的不同路径?你的用例是什么?大多数情况下,我认为只要你查看用例而不是问题的技术解决方案,答案就很简单了。你能澄清一下“我们为一个对象分配了0或1张ace”吗?
0
是指“明确的否定许可”还是“缺乏(肯定的)许可”?