3

我正在尝试在启用 RLS 并Enable insert for authenticated users only添加策略的表中插入一行。不幸的是,即使我正确登录,我也无法插入。

重现步骤:

  1. 创建提交表
create table submission (
  stuff text
);
  1. 启用 RLS
alter table submissions
  enable row level security
  1. 添加策略
CREATE POLICY "Enable insert for authenticated users only" ON public.submissions FOR INSERT WITH CHECK (auth.role() = 'authenticated');
  1. 在客户端,我使用魔术链接登录(该对象已正确添加到本地存储中,所以我知道我已登录)

  2. 我尝试插入

const { data, error } = await supabase
 .from("submissions")
 .insert({ stuff: 'hello' });

Authorization Bearer <Jwt>存在于 http 调用中。

  1. 但我得到了错误
{
  "hint":null,
  "message":"new row violates row-level security policy for table \"submissions\"",
  "code":"42501",
  "details":null
}

我在这里做错了什么?

4

2 回答 2

2

我发现出了什么问题。

问题是,默认行为supabase.insert返回我们刚刚插入的行,换句话说,它从表中选择(读取)它。由于我没有添加策略来读取表格,所以它失败了。

所以有两个解决方案:

  1. 添加新策略以能够从该表中进行 SELECT
  2. 添加{ returning: "minimal" }到,supabase.insert因此它不会将行发回
于 2021-10-11T14:46:54.963 回答
1

是的——我第一次尝试添加仅允许 INSERT 而不允许 SELECT 的 RLS 策略时遇到了同样的事情(用于让用户将信息记录到表中。)

我们已经讨论过{ returning: "minimal" }为插入、更新和删除设置默认值,但我认为这不会发生。

这只是需要注意的事情(它在文档中,但很容易错过。)

于 2021-10-14T14:24:39.757 回答