对具有 parent/child 关系的不同表的访问控制

Access control on different tables with parent/child relationships

我正在尝试在我正在编写的应用程序中设置访问控制。我见过像 ACL 和 Roles/Permission 系统这样的方法(就像 here and many others, as well as the Nested Set Model 中描述的那样),但我不确定我是否可以使用这些方法实现我的目标。

我想做的是找到一种方法来允许访问对象的子项。问题是子项存储在不同的 table 中并代表不同的实体。一个例子:

City > Streets (city_id) > Houses (street_id) > People (house_id)

在这种情况下,这些对象中的每一个都存储在数据库中的不同 table 中,并使用括号中的字段指向其父对象。我想要做的是能够仅在 "City" 级别上授予用户权限(即授予城市 #10 的权限),这将授予对下面各种 table 的所有子项的访问权限,无论是街道、房屋还是人。 (所以,我可以问类似 "Does User A have permission on House #16?" 的问题,系统可以确定 House #16 是否是 City #10 对象的 child/grandchild 等。)

现在,我知道这可以通过在数据库中使用多个连接等来完成,但这感觉像是一种 "brute force" 方法,并且不会非常枯燥或可重用。如果可能的话,我希望找到一种更 efficient/less 天真的方法来完成此任务。谢谢!

找到答案:Models for Hierarchical Data in SQL and PHP

该视频谈到 "closure tables",这正是我要找的。使用闭包 table 中的 "depth" 和 "ancestor" 字段,我可以从层次结构的任何级别(人、房屋、街道)查明数据所属的城市。

我也创建了一个 "securables" table,它的每一行都来自人、房屋和街道 table。然后我的闭包 table(以及一些配置来告诉每个 child table 它的深度应该是什么)将它们关联到一棵树中。然后,使用配置的深度,我可以随时从任何节点内的任何节点获取城市树​​的根 - 在单个查询中!急!