【发布时间】:2021-08-31 20:14:16
【问题描述】:
这是我用于此策略的表/实体的摘要(简化为 SO)。
user
----
id (pk)
event
-----
uuid (pk)
host_id (fk -> user)
privacy: int
friendship
----------
user_id (pk, fk -> user)
friend_id (pk, fk -> user)
invitation
----------
user_id (pk, fk -> user)
event_uuid (pk, fk -> event)
ENUMS:
- Privacy (Public, Friends, Private) = (0, 1, 2)
在我的情况下,我想确保,使用 PostgreSQL 中的行级安全性或其他方法(可能是条件?)是用户只能在以下条件之一的情况下看到事件:
- 如果他们是活动的主办方
- 如果活动的隐私是公开的
- 如果活动的隐私是朋友并且他们是活动主持人的朋友
- 如果他们被邀请参加活动
我了解这些条件很多,但我不确定检查所有这些条件的最佳格式是什么。目前,这是我用来检查所有这些的 RLS 策略,但它似乎很冗长,我想知道是否有一些我遗漏的东西可以优化它:
create policy read_event
on event
for select
using (
-- is host
event.user_id = ?
or
-- is public
event.privacy = 0
or
-- is invited
exists (
select *
from invitation as i
where i.user_id = ? and i.party_uuid = event.uuid
)
or
-- is friends and party is friends-level privacy
exists (
select *
from friendship as f
where f.user_id = ? and f.friend_id = party.user_id
or f.user_id = party.user_id and f.friend_id = ?
)
and
event.privacy = 1
)
“?”可以用当前用户的 id 进行查询(使用会话变量或其他替代方法)。总的来说,这是我正在尝试做的简化版本,但我只是想看看我是否走在正确的道路上,或者我是否遗漏了什么。
此外,这在某种程度上超出了这个 SO 问题的范围,但如果有人有洞察力,RLS 策略在从其他表加入时是否级联(例如,如果我创建一个带有 fk 的活动邀请,会不会检查 RLS 策略是否在插入时读取事件?)
非常感谢您的帮助!
【问题讨论】:
标签: sql postgresql security row-level-security