如何为树(adjacency-list)结构数据库设置用户权限?

时间:2012-08-21 16:09:47

标签: mysql permissions tree adjacency-list

我们正在使用mysql。假设我们有一个Adjacency List模型表。 (我知道它没有规范化。)例如,人员表中包含以下字段:

Personnel
|employee|boss    |salary|
--------------------------
|CEO     |null    |999999|
|boss1   |CEO     |99    |
|boss2   |CEO     |99    |
|slvdrvr1|boss1   |9     |
|slvdrvr2|boss1   |9     |
|slave1  |slvdrvr1|1     |
|slave2  |slvdrvr1|1     |
|slave3  |slvdrvr1|1     |
|slave4  |slvdrvr2|1     |
|slave5  |boss2   |1     |
|slave6  |boss2   |1     |

我们还有一些用户表。例如,

Uers
|userid|role   |
----------------
|super1|b1     |
|super2|b2     |
|user1 |sd     |
|ruut  |admin  |

假设薪资信息是保密的。因此,一些用户可以从某个分支机构查看薪资信息。

例如,角色b1可以查看/编辑来自boss1和down的所有工资。角色b2可以查看/编辑来自boss2和down的所有工资。角色sd可以查看/编辑slvdrvr1和slvdrvr2及以下的所有工资。因此,我们需要设置用户 - 人员权限表来实现此目的。

人员表很大,有数万行。

我的问题是我们如何设置一个我们可以轻松维护和查询的权限表?

例如,选项1:我们可以为每个人设置角色权限。但是,权限表将是巨大的。

选项2:我们只能为父节点设置角色权限。但是,每当用户想要查看一定数量的记录时,我们必须查找每个记录的权限,直到我们拥有设置的位置。

用户数量约为数百人。 角色数小于100。

如果不清楚,请问我问题。提前谢谢。

1 个答案:

答案 0 :(得分:1)

为了让生活变得更有趣,请考虑在用户中使用树形结构!

来实现,创建另一个表“User_EMPL_ACCESS”,它应该如下所示:

表USER_EMPL_ACCESS(       User_ID char(..),       ACCESS_PATH字符(..) )

在访问路径中,存储每个用户有资格查看的最顶层节点的完全限定路径。

然后,开发一个名为hasAccess的UDF(userID,EMPLID)。

hasAccess函数应执行以下操作:

  1. 以UserID
  2. 开头
  3. 从USER_EMPL_ACCESS获取用户的访问路径
  4. 使用CTE逻辑将Adjacency Table扩展为完全限定的路径。如果您的数据库未提供CTE,请将Adjacency Model转换为NestedSet模型。
  5. 从根
  6. 开始,获取用户访问路径和邻接路径的交集
  7. 如果输入EMPLID是上述任何交叉路径的叶节点,则返回1,否则返回0.
  8. 现在您的查询如下所示:

        select * from SALARY_TABLE where MONTH = 'JAN' 
        and hasAccess('myUserID', SALARY_TABLE.EMPLID) = 1