sql - 如何为访问控制列表 (ACL) 构建数据模型

标签 sql database database-design

当您只处理对离散资源具有一定级别访问权限的离散用户时,如何为充当访问控制列表 (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/

相关文章:

mysql - 我应该如何在我的 SQL 查询中实现和 IF 语句?

mysql - 改进我的 sql 查询以在表的所有列中搜索文本

database - 良好的数据库设计 : enum values: ints or strings?

mysql - 在数据库中存储距离矩阵

mysql - 在数据库中存储与动态数量的类关联的用户

c# - 如果没有要返回的结果集,查询似乎真的很慢

mysql - Oracle SQL 触发器更新问题 - 研究/学习

python - 我可以将 INSERT 语句分成几个而不重复插入行吗?

数据库索引——表的大小重要吗?

php - 将 2 个不同的查询合并为一个