MySQL:从RBAC数据库中检索所有权限的最有效方法是什么?

时间:2013-10-01 14:08:53

标签: mysql

美好的一天。

我有一个基于角色的访问控制数据库,并寻找获得用户拥有的所有权限的有效方法。这是原理图:

RBAC database design

现在我需要以最(可能)有效的方式获得所有用户的许可。试过这个问题:

SELECT p.name
  FROM permission p
  WHERE p.id = (
    SELECT rpl.permission_id
    FROM role_permission_list rpl
    WHERE rpl.role_id = (
      SELECT url.role_id
      FROM user_role_list url
      WHERE url.user_id = 2
    )
)

但这失败了。由于子查询返回多于1个结果。试图考虑加入 - 无法弄明白。

提前致谢。

PS:将来会有一个permission_overrides表,因为一个独立的访问控制实体可能拥有独占的权限集。

2 个答案:

答案 0 :(得分:1)

尝试一下:

SELECT u.id, p.name
FROM `user` u
LEFT JOIN user_role_list url ON u.id = url.user_id
LEFT JOIN role r ON r.ID = url.role_id
LEFT JOIN role_permission_list rpl ON rpl.role_id = r.id
LEFT JOIN permission p ON p.ID = rpl.permission_id
WHERE u.id = A_Users_ID

答案 1 :(得分:1)

这将是简单的3个连接,如:

SELECT
  `user`.id,
  permission.*
FROM
  `user`
    LEFT JOIN user_role_list ON `user`.id=user_role_list.user_id
    LEFT JOIN role_permission_list ON user_role_list.role_id=role_permission_list.role_id
    LEFT JOIN permission ON role_permission_list.permission_id=permission.id
WHERE
  `user`.id=$user_id

(因为你没有找到具体权限来自的角色描述,我没有包括该表来查询)