管理用户权限的正确方法(用户层次结构)

时间:2009-10-24 22:35:50

标签: database database-design orm

我想允许我的应用程序的用户添加子用户并设置允许每个子用户查看或执行操作的权限。

我的想法是有一个单独的PRIVILEGES表,如下所示:

+-----------------+--------+
|privilege        |  value |
+-----------------+--------+
|create sub users |    1   |
|edit own profile |    2   |
|add new site     |    3   |
|delete site      |    4   |
+-----------------+--------+

然后,当主用户选择权限时,使用该值更新子用户权限列,例如:

+--------------+-----------+
|user_id       | privilege |
+--------------+-----------+
|user_1        |     4     | 
|user_2        |     2     |
|user_3        |     1     |
|user_4        |     2     |
+--------------+-----------+

但是价值不会给出独特的金额。例如:

privileges
1 -> create sub users
+
2 -> edit own profile
= privilege 3 (create sub users, edit own profile)

但是还有另一个特权值3(添加新网站),所以这不起作用。

所以我的问题是:如何使任何可能的权限组合独一无二?

是否有更智能的方式来管理权限?

1 个答案:

答案 0 :(得分:5)

如果您想将其保留为一列,请使用base 2占位符。

1 - represents priv 1
2 - represents priv 2
4 - represents priv 3
8 - represents priv 4
16 - represents priv 5
32 - represents priv 6

然后你可以取每个模数来确定他们是否有这种权利。

所以..

3 = priv 1 and priv 2
9 = priv 1 and priv 4

63 = all privs.

等等。

让你的priv表允许每个用户有多个条目可能更简单。

编辑:如果您仍希望使用单一列来存储priv,请添加另一列来存储授予权限的人。

但是......我仍然建议分别存储每个私有。 在priv,user_id和grantor上创建一个带有组合主键的表。 组合的主键将确保每个priv都是唯一的,因此您无需在插入之前进行检查。要创建组合主键:

ALTER TABLE priv ADD PRIMARY KEY (user_id,grantor,priv_id);

然后添加或重置priv REPLACE INTO priv (user_id,grantor,priv_id) VALUES (?,?,?)

删除用户的priv DELETE FROM priv WHERE user_id = ? AND priv_id = ?

删除用户的所有权限DELETE FROM priv WHERE user_id = ?

删除授权人的所有子用户... DELETE FROM priv WHERE grantor = ?

在授予者中获取用户的所有权限:SELECT * FROM priv WHERE user_id = ? AND grantor = ?