当您只处理对离散资源具有一定级别访问权限的离散用户时,如何为充当访问控制列表 (ACL) 的数据库表建模是相当明显的。像这样:
表 acl (
用户 ID 整数,
resource_id INT,
访问类型 INT
)
... 其中 access_type 是一个数字,代表如下内容:
0(或缺少user_id和resource_id的记录)表示没有权限
1表示只读
2表示完全控制
然而,当您遇到用户可以是一个或多个组的成员并且组可以包含其他组的情况时,它开始变得更加棘手。那么资源可以是包含其他资源的文件夹。
除了在运行时执行一大堆递归查询以确定用户对资源的访问级别这一明显糟糕的方法之外,这些场景往往如何处理?像这样对 ACL 建模是否存在普遍接受的设计?
最佳答案
您使用的数据库是否支持 connect by
或类似的东西?
在 Oracle 中,我实现了以下内容。
Table Group //Just the parent groups
{
groupCode varchar
groupDesc
}
Table groupMap //associates groups with other groups
{
parentGroup
childGroup
}
table userGroup //can assign user to more than one group
{
userId
groupCode
}
然后使用connect by
获取用户的所有子组
SELECT rm.CHILDGroup as roleCode
FROM groupMap rm
CONNECT BY PRIOR rm.CHILDGroup = rm.PARENTGroup
START WITH rm.CHILDGroup in
(SELECT ur.groupCode
FROM userGroup ur
WHERE ur.userId = &userId);
此查询将获取分配给 userGroup
中用户的所有组以及分配给用户所属组的所有子组。
关于sql - 如何为访问控制列表 (ACL) 构建数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4138715/