0

再会。

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

RBAC 数据库设计

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

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 表,因为一个独立的访问控制实体可能拥有一组独占的权限。

4

2 回答 2

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
于 2013-10-01T14:12:46.940 回答
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

(因为您不是在寻找特定权限来自的角色描述,所以我没有包含要查询的表)

于 2013-10-01T14:13:04.173 回答