美好的一天。
我有一个基于角色的访问控制数据库,并寻找获得用户拥有的所有权限的有效方法。这是原理图:
现在我需要以最(可能)有效的方式获得所有用户的许可。试过这个问题:
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表,因为一个独立的访问控制实体可能拥有独占的权限集。
答案 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
(因为你没有找到具体权限来自的角色描述,我没有包括该表来查询)