【问题标题】:How to build a data model for an access control list (ACL)如何为访问控制列表 (ACL) 构建数据模型
【发布时间】:2011-05-07 12:37:34
【问题描述】:

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

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

... 其中 access_type 是一个数字,表示类似:

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

1 表示只读

2 表示完全控制

但是,当您遇到诸如用户可以是一个或多个组的成员并且组可以包含其他组的场景时,它就开始变得棘手了。那么资源可以是包含其他资源的文件夹。

除了在运行时执行一大堆递归查询以确定用户对资源的访问级别这一明显糟糕的方法之外,这些情况往往会如何处理?是否有普遍接受的设计来为这样的 ACL 建模?

【问题讨论】:

  • 我遇到了同样的问题,所以我正在寻找答案。就递归而言,我假设您指的是文件夹的分层性质,请查看此问题以获取一些想法:stackoverflow.com/questions/4048151/…
  • 是的,这就是我所指的 - 必须执行递归查询才能在用户组和文件夹层次结构/图表中上下移动。

标签: sql database database-design


【解决方案1】:

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

【讨论】:

【解决方案2】:

Spring ACL 是具有 Java 继承性的 ACL 的可靠实现。它是开源的,所以我会检查它是否是您正在寻找的。​​p>

【讨论】:

猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多