提问人:AndersD 提问时间:9/28/2023 更新时间:9/28/2023 访问量:69
Supabase realtime - RLS 仅在 url /xyz 与 DB 列中的 xyz 匹配时才允许删除
Supabase realtime - RLS to only allow delete if url /xyz matches xyz in DB column
问:
我有一个表格“boards”,其中有一列“edit_link”,这是一个随机字符串
我希望访问页面 /edit/xyz 的用户只能更新和删除 edit_link 为 xyz 的行。实时。
我使用 RPC 查看了这个: Postgresql:删除查询表中每一行的能力,但不确定这是否可以转化为实时。
我还没有找到一种方法来发送参数,以供我调用 RLS 策略使用
我将如何在 Supabase 中限制它?没有登录名。只是一个唯一的 URL。
答:
0赞
Zegarek
9/28/2023
#1
可以使用自定义设置来保存当前链接,然后从 RLS: 演示中引用它
create policy only_xyz on boards
using (edit_link = current_setting('public.pass_the_current_link_here',true))
with check (edit_link = current_setting('public.pass_the_current_link_here',true));
只要该设置始终设置为当前访问的页面,它就只允许对属于该页面的行进行操作:
set foo.pass_the_current_link_here='example.com/mypage';
insert into boards (edit_link) values ('example.com/mypage') returning *;
编号 | edit_link |
---|---|
2 | example.com/mypage |
设置不匹配将在以下位置引发错误:insert
insert into boards (edit_link) values ('example.com/another_page') returning *;
ERROR: new row violates row-level security policy for table "boards"
除非设置匹配,否则所有 、 和 语句将一无所获。如果新旧值都需要匹配(策略部分的规则强制新值匹配,保护旧值):select
update
merge
delete
update
merge
using
with check
delete from boards where edit_link='example.com/another_page' returning *;
DELETE 0
update boards set edit_link='example.com/mypage'
where edit_link='example.com/another_page'
returning *;
UPDATE 0
评论
0赞
Zegarek
9/29/2023
如果用户可以自由发布自己的声明,我建议的设置可能会被用户更改。您可以隔离会话数据,并为每个人提供一个秘密令牌,您可以在 RLS 策略的子查询中验证,但这些令牌可能会被泄露、破解、交换,而且我希望这种方法是您在指定“实时”时保留的。
0赞
Zegarek
9/29/2023
RLS 验证的令牌类型模拟用户分离,RLS 将令牌验证对象置于最终用户角色的范围之外,这与注入不同。where
评论
edit_link
标记的所有行。他们会在他们的请求中传递这个令牌,你只需将其转换为条件即可。WHERE edit_link_token = $1
WHERE
DELETE
SELECT *