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

时间:2010-11-09 21:16:02

标签: sql database database-design

当您只处理对离散资源具有某种级别访问权限的离散用户时,如何建模将充当访问控制列表(ACL)的数据库表是相当明显的。像这样:

TABLE acl ( user_id INT, resource_id INT, access_type INT )

...其中access_type是一个代表如下内容的数字:

0(或缺少user_id和resource_id的记录)表示无法访问

1表示只读

2表示完全控制

然而,当您遇到类似用户可能是一个或多个组的成员以及组可以包含其他组的情况时,它开始变得更加棘手。然后资源可以是包含其他资源的文件夹。

除了在运行时执行大量递归查询以确定用户对资源的访问级别的明显不好的方法之外,这些方案如何处理?是否有像这样建模ACL的常用设计?

2 个答案:

答案 0 :(得分:2)

您使用的是支持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中用户的所有组以及分配给用户所属组的所有子组。

答案 1 :(得分:-1)

Spring ACL是ACL的可靠实现,具有java的继承。它是开源的,所以我会检查它是否是你正在寻找的。