可撤销的决策树
Revokable Discretionary Tree
根据我自己的理解,我正在编写一个分层自主访问系统。它不是 DAC,它更类似于 Discretionary RBAC,但这些细节对于手头的问题并不重要。
每个user
都有一定的Role
;每个 Role
都有一组特定的 permissions
.
每个 Role
都以树状结构组织:名为 root 的 role
拥有所有权限; root 的子角色拥有其父角色权限的子集。
以上示意图:
假设 user
和 role
名为 经理 决定委托 permission
名为 set_salary 给 user
和 role
名为 程序员 ,后者随后将此 permission
委托给 user
role
名为 intern.
有人决定用名为 manager 的角色解雇 user
。结果,名为 manager 的 role
从 user
中撤消了。更重要的是,上述user
授予的所有权限也需要撤销。
所以我的问题是:
有没有一种数据结构可以方便识别:
- 在层次结构树结构中由特定主题委托的权限链;
- 某个权限是否已授予某个主题?
adjacency list怎么样?
或者换句话说,'a list of linked lists',类似于我们在表示图形时使用它的方式。
每个用户可以关联一个委托链表。
委托链表的节点可以是<permissionId, userId>
的形式,表示链表的拥有者已经将权限permissionId
委托给用户userId
。然后我们可以遍历用户userId
的链表,递归重复同样的过程,直到找到委托链表为空的用户。
这个算法和Depth-first search基本一样。
此模型不支持像您描述的经理 -> 程序员 -> 实习生情况那样按用户委派权限。为角色设置权限并为角色设置新权限会影响所有拥有该角色的用户。
要支持每个用户的权限委派,需要描述委派的新关系。描述它所需的数据是:哪个用户授予了权限,哪个用户获得了权限以及被委托的权限。比如,与列的关系 delegatedPermission:
- 给UserId
- 接收用户 ID
- permissionId
根据我自己的理解,我正在编写一个分层自主访问系统。它不是 DAC,它更类似于 Discretionary RBAC,但这些细节对于手头的问题并不重要。
每个user
都有一定的Role
;每个 Role
都有一组特定的 permissions
.
每个 Role
都以树状结构组织:名为 root 的 role
拥有所有权限; root 的子角色拥有其父角色权限的子集。
以上示意图:
假设 user
和 role
名为 经理 决定委托 permission
名为 set_salary 给 user
和 role
名为 程序员 ,后者随后将此 permission
委托给 user
role
名为 intern.
有人决定用名为 manager 的角色解雇 user
。结果,名为 manager 的 role
从 user
中撤消了。更重要的是,上述user
授予的所有权限也需要撤销。
所以我的问题是:
有没有一种数据结构可以方便识别:
- 在层次结构树结构中由特定主题委托的权限链;
- 某个权限是否已授予某个主题?
adjacency list怎么样?
或者换句话说,'a list of linked lists',类似于我们在表示图形时使用它的方式。
每个用户可以关联一个委托链表。
委托链表的节点可以是<permissionId, userId>
的形式,表示链表的拥有者已经将权限permissionId
委托给用户userId
。然后我们可以遍历用户userId
的链表,递归重复同样的过程,直到找到委托链表为空的用户。
这个算法和Depth-first search基本一样。
此模型不支持像您描述的经理 -> 程序员 -> 实习生情况那样按用户委派权限。为角色设置权限并为角色设置新权限会影响所有拥有该角色的用户。
要支持每个用户的权限委派,需要描述委派的新关系。描述它所需的数据是:哪个用户授予了权限,哪个用户获得了权限以及被委托的权限。比如,与列的关系 delegatedPermission:
- 给UserId
- 接收用户 ID
- permissionId