具有多个角色/权限的用户管理的用户表设计

时间:2011-09-09 22:28:40

标签: sql database

尝试设置用户登录和管理...

我想知道您将用于具有复杂用户角色的用户管理的表设置。

我想拥有多个级别的用户权限/角色,并且如果需要,每个级别内都有更详细的控件。

我将这组权限描述为一个表格。行是资源,列是属性和可用操作。我想设计一个系统,用户可以访问具有特定权限的一组资源,并可能有多个具有不同权限的组。

我正在研究modx处理用户表的方式,但这可能有点复杂。

1 个答案:

答案 0 :(得分:10)

我最近解决了这个问题,最后使用了近似role based access control的解决方案

粗略地说,我实施的系统被描述为

  • 主题具有身份验证功能的实际用户,例如,使用密码
  • 权限:代表任何受控资源;如果用户拥有权限,则授权使用该资源;
  • 角色:主题和权限之间的联系;每个角色都分配了一组主题,权限和其他角色;

要理解的重要一点是角色分配;从一个角色到另一个角色的连接是反身;父角色中的主体可以访问子角色中的权限,但不是相反,主体未通过这些主题分配给的角色的父级授权。一个附加的约束是不允许角色从自身继承;虽然这只是为了让人们能够轻松理解角色的结果图,并避免意外地将权限授予大群主题。

通过正确的权限组合,这表明非常有表现力;您可以拥有角色来授予一般访问权限,以及授权更具体的动词或对象;然后你的应用程序检查以确保主题具有所有必需的权限(可以访问,可以执行此操作,可以修改该对象)

角色最终采取的结构是部分顺序;一个简单的邻接角色列表原来是一个查询主题权限的不方便的方法(在MySQL上,它将运行的地方),所以我还必须设计一组触发器来保持第二个关系是最新的表达角色分配的传递性结束。

更新

似乎角色的递归结构增加了比它解决的更复杂,至少对于这个特定的应用程序,因为角色主要由客户支持管理,而不是由应用程序设计本身管理。我目前实现它的方式,用户可以在组中,每个组都有一组权限分配给它。每个“分配”都有一个优先级,可以授予或拒绝相应的权限。优先级最高的权限获胜。架构大致是:

CREATE TABLE user (
    username VARCHAR PRIMARY KEY,
    hashedpassword VARCHAR);

CREATE TABLE groups (
    groupname VARCHAR PRIMARY KEY );

CREATE TABLE user_groups (
    username VARCHAR PRIMARY KEY REFERENCES user(username),
    groupname VARCHAR PRIMARY KEY REFERENCES groups(groupname),

CREATE TABLE permission (
    permissionname VARCHAR PRIMARY KEY,
    defaultpolicy BOOLEAN );

CREATE TABLE group_permission (
    permissionname VARCHAR PRIMARY KEY REFERENCES permission(permissionname),
    groupname VARCHAR PRIMARY KEY REFERENCES groups(groupname),
    priority INTEGER,
    policy BOOLEAN );

非递归结构有效地简化了解决权限的问题;

(
SELECT policy, priority 
FROM group_permission
JOIN user_groups ON user_groups.groupname = group_permissions.groupname
WHERE username = :username
AND permissionname = :perm

UNION

SELECT 
    defaultpolicy as policy,
    (SELECT min(priority) - 1 FROM group_permission) as priority
FROM permission
WHERE permissionname = :perm
)
ORDER BY priority DESC
LIMIT 1