假设以下数据库结构(如有需要,可以修改)...
我正在寻找一种确定给定页面上给定用户的“有效权限”的好方法,该方法允许我返回包含Page和有效权限的行。
我认为理想的解决方案可能包括使用CTE来执行递归的功能,以评估当前用户给定页面行的“有效权限”。
背景和实施细节
上面的架构表示内容管理系统的起点,在其中可以通过将用户添加到角色或从角色中删除来授予用户权限。
系统中的资源(例如页面)与角色关联,以授予链接到该角色的用户组所授予的权限。
这个想法是能够通过简单地拒绝所有角色并将树中的根级别页面添加到该角色,然后将用户添加到该角色来轻松锁定用户。
当(例如)为公司工作的承包商长期不可用时,这将允许许可结构保留在原位,然后通过简单地从该角色中删除用户,也将允许相同的原始权限授予。
权限基于典型的ACL类型规则,遵循这些规则可能适用于文件系统。
CRUD权限应为可为空的位,因此,在满足以下条件的情况下,可用值是true,false和未定义:
- 假+任何东西=假
- 正确+未定义=正确
- 真+真=真
- 未定义+未定义=未定义
如果任何权限为假->假 否则为true-> true 其他(所有未定义)-> false
换句话说,除非您通过角色成员资格授予任何权限,并且拒绝规则将覆盖允许规则,否则您将无任何权限。
应用于此权限的“集合”是指直到当前页面并包括当前页面的所有应用于树的权限,换句话说:如果将false应用于应用于此页面的树中任何页面的任何角色,则结果为false ,但是如果未定义到此处的整个树,则当前页面包含true规则,则此处的结果为true,但对父级而言将为false。
如果可能的话,我想宽松地保留db结构,同时请记住,我的目标是能够执行以下操作:select * from pages where effective permissions (read = true) and user = ?
因此,任何解决方案都应能够使我拥有一个具有有效权限的可查询集。以某种方式(只要可以指定条件,返回它们是可选的)。
假设存在2个页面,其中1个是其他角色的子代,并且存在2个角色,一个用于admin用户,一个用于只读用户,这两个页面都仅链接到根级别页面,我希望看到这样的内容作为预期的输出:
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False