具有父/子关系的不同表的访问控制

时间:2016-07-10 16:32:46

标签: php mysql permissions hierarchy

我试图在我写的应用程序中设置访问控制。我已经看过类似ACL和角色/权限系统的方法(如here和其他许多人所描述的那些,以及Nested Set Model),但我不确定我是否可以完成我的工作使用这些方法的目标。

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

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

在这种情况下,这些对象中的每一个都存储在数据库中的不同表中,并使用带括号的字段指向其父对象。我想要做的是能够授予用户关于" City"等级(即,城市#10的授予权限),它将授予对下面各种桌子上的所有儿童的访问权限,无论是街道,房屋还是人。 (所以,我可以问一些像#34;用户A是否拥有House#16的许可?"并且系统可以确定House#16是否是City#10对象的子/孙等。 )

现在,我知道这可以通过在数据库中使用多个连接等来完成,但这感觉就像一个强大的"蛮力"接近并且不会非常干燥或可重复使用。我希望找到的是一种更有效/更少天真的方法来实现这一目标。谢谢!

1 个答案:

答案 0 :(得分:0)

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

该视频谈到了“封闭表”,这正是我所寻求的。使用闭包表中的“深度”和“祖先”字段,我可以从数据所属城市的层次结构(人,房屋,街道)中精确定位。

我也创建了一个“securables”表,它对于人,房屋和街道表的每一行都有一行。然后我的闭包表(以及一些告诉每个子表的深度应该是什么的配置)将它们组合成一棵树。然后,使用该配置的深度,我可以随时从单个查询中的任何节点获取城市树​​的根!的Presto!