我正在尝试创建一个访问控制系统。
这是我试图控制访问权限的表的简化示例:
things table:
id group_id name
1 1 thing 1
2 1 thing 2
3 1 thing 3
4 1 thing 4
5 2 thing 5
访问控制表如下所示:
access table:
user_id type object_id access
1 group 1 50
1 thing 1 10
1 thing 2 100
可以通过直接指定“事物”的 id 来授予访问权限,也可以通过指定组 id 来授予整个事物组的访问权限。在上面的示例中,用户 1 已被授予对组 1 的访问级别 50,除非有任何其他规则授予对单个事物的更具体的访问权限,否则该级别应适用。
我需要一个查询,它返回一个事物列表(只有 id 可以)以及特定用户的访问级别。因此,使用上面的示例,我希望用户 id 1 是这样的:
desired result:
thing_id access
1 10
2 100
3 50 (things 3 and 4 have no specific access rule,
4 50 so this '50' is from the group rule)
5 (thing 5 has no rules at all, so although I
still want it in the output, there's no access
level for it)
我能想到的最接近的是:
SELECT *
FROM things
LEFT JOIN access ON
user_id = 1
AND (
(access.type = 'group' AND access.object_id = things.group_id)
OR (access.type = 'thing' AND access.object_id = things.id)
)
但这会返回多行,而我只希望“事物”表中的每一行都有一个。我不确定如何为每个“事物”减少一行,或者如何将“事物”规则优先于“组”规则。
如果有帮助,我使用的数据库是 PostgreSQL。
如果我错过了任何信息,请随时发表评论。
提前致谢!