我正在尝试创建一个访问控制系统。
这是一个简化的示例,展示了我正在尝试控制访问的表的外观:
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已被授予50的访问级别给组1,该级别会应用,除非有其他规则授予了更具体的物品访问权限。
我需要一个查询,返回一个特定用户访问级别的东西列表(仅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)
)
但是返回了多行,而我只想为每个“things”表中的行返回一个。我不确定如何将其减少到每个“thing”为一个行,或如何优先考虑“things”规则以取代“group”规则。
如果有帮助的话,我使用的数据库是PostgreSQL。
如果有我遗漏的信息,请随意留言。
提前致谢!