security - 使该安全系统适应多重继承的最佳方法是什么?

标签 security tree symfony theory

系好安全带,这是一个棘手的问题。

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

我们正在使用 Symfony2 和 Symfony2 安全系统(域对象、Acls、Aces 等)。我们的 Acl 树反射(reflect)了我们的节点树。

创造一些语言:

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

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

到目前为止,一切都很好。这一切都有效。

某些节点不仅有父节点,而且还与其他节点关联(多对多)。当一个节点与另一个节点关联时,这表示树上有一条供 ACL 遵循的单独路径。 IE 中,我们将有 1 条或多条路径沿着树到根部来收集 ace。

Leaf < Parent < GrandParent < Root
Leaf < AssociatedNode < AssociatedNodeParent < AssociatedNodeGrandParent < Root
 ...

或者管理王牌投票的逻辑很好,我们不确定的是如何表示树上的多条路径。我们当前(阅读:糟糕)的想法是:

  • acl 树中的多个父行为
    • 优点
      • 看起来更干净?
    • 缺点
      • 几乎完全重写了安全系统以将其放入其中。
      • 潜在的老鼠嵌套。
  • 针对实体重复对象标识/acl,指定不同的父级。
    • 优点
      • 呃...
    • 缺点
      • 可能会创建大量 acl 记录。
      • 难以用代码进行管理。

最佳答案

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

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

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

祝您的权限模型好运。

关于security - 使该安全系统适应多重继承的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9561197/

相关文章:

java - 不断收到 "java.security.AccessControlException access denied:"错误

algorithm - 树中每对节点之间的距离

python - 从向量集中找到最相关的向量

symfony - 在普通表单类上使用奏鸣曲字段类型

php - Doctrine 用单表继承连接两个模型,第二个连接变慢

c - 这段代码是否存在某种安全问题?

javascript - javascript(或浏览器扩展)如何检测受限功能的使用?

security - PHP session 安全

java - 为树中的叶子分配不同的值

php - 无法为名为 default 的连接创建数据库 `symfony`