可撤销的决策树

Revokable Discretionary Tree

根据我自己的理解,我正在编写一个分层自主访问系统。它不是 DAC,它更类似于 Discretionary RBAC,但这些细节对于手头的问题并不重要。


每个user都有一定的Role;每个 Role 都有一组特定的 permissions.
每个 Role 都以树状结构组织:名为 rootrole 拥有所有权限; root 的子角色拥有其父角色权限的子集。

以上示意图:


假设 userrole 名为 经理 决定委托 permission 名为 set_salaryuserrole 名为 程序员 ,后者随后将此 permission 委托给 user role 名为 intern.

有人决定用名为 manager 的角色解雇 user。结果,名为 managerroleuser 中撤消了。更重要的是,上述user授予的所有权限也需要撤销


所以我的问题是:
有没有一种数据结构可以方便识别:

adjacency list怎么样?
或者换句话说,'a list of linked lists',类似于我们在表示图形时使用它的方式。

每个用户可以关联一个委托链表。
委托链表的节点可以是<permissionId, userId>的形式,表示链表的拥有者已经将权限permissionId委托给用户userId。然后我们可以遍历用户userId的链表,递归重复同样的过程,直到找到委托链表为空的用户。

这个算法和Depth-first search基本一样。

此模型不支持像您描述的经理 -> 程序员 -> 实习生情况那样按用户委派权限。为角色设置权限并为角色设置新权限会影响所有拥有该角色的用户。

要支持每个用户的权限委派,需要描述委派的新关系。描述它所需的数据是:哪个用户授予了权限,哪个用户获得了权限以及被委托的权限。比如,与列的关系 delegatedPermission:

  • 给UserId
  • 接收用户 ID
  • permissionId