Supabase realtime - RLS 仅在 url /xyz 与 DB 列中的 xyz 匹配时才允许删除

Supabase realtime - RLS to only allow delete if url /xyz matches xyz in DB column

提问人:AndersD 提问时间:9/28/2023 更新时间:9/28/2023 访问量:69

问:

我有一个表格“boards”,其中有一列“edit_link”,这是一个随机字符串

我希望访问页面 /edit/xyz 的用户只能更新和删除 edit_link 为 xyz 的行。实时。

我使用 RPC 查看了这个: Postgresql:删除查询表中每一行的能力,但不确定这是否可以转化为实时。

我还没有找到一种方法来发送参数,以供我调用 RLS 策略使用

我将如何在 Supabase 中限制它?没有登录名。只是一个唯一的 URL。

PostgreSQL supabase 行级安全性

评论

0赞 Bergi 9/28/2023
您根本不需要行级安全性。“访问页面的用户”是没有意义的,你真正的意思是用户可以更新或删除他们知道其edit_link标记的所有行。他们会在他们的请求中传递这个令牌,你只需将其转换为条件即可。WHERE edit_link_token = $1
0赞 AndersD 9/29/2023
WHERE 子句,您的意思是在客户端,如果是这样,什么可以防止任何不良的预期用户检查网络选项卡并模仿和更改调用以删除表中的所有行?
0赞 Bergi 9/29/2023
该子句不应在客户端上生成,不可以。它必须由您的后端(或您配置的 supabase 后端)生成。客户端不能直接对数据库发出查询,就像它们不能对该表发出查询一样。WHEREDELETESELECT *
0赞 AndersD 9/29/2023
如果它不是 RLS,我将如何强制 supabase 在“board”表的每个请求上附加此 WHERE 子句,以及如何在请求中传递 $1 参数?
0赞 Bergi 9/29/2023
那么,您希望如何将每个请求的链接传递到表中?

答:

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"

除非设置匹配,否则所有 、 和 语句将一无所获。如果新旧值都需要匹配(策略部分的规则强制新值匹配,保护旧值):selectupdatemergedeleteupdatemergeusingwith 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