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