You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用RLS与策略后无法向Supabase的petition表插入数据

解决RLS启用后插入petition表失败的问题

以下是针对你遇到的问题的排查和解决方案:

1. 确认用户认证状态是否有效

虽然应用实现了登录,但插入操作时可能存在会话过期或认证信息未正确传递的情况。在插入前检查当前用户会话:

const { data: session } = await supabase.auth.getSession();
console.log("当前会话:", session);

如果session.user不存在或为空,说明用户未正确完成认证,需要重新登录或检查认证流程。

2. 验证INSERT策略的具体规则

你提到的策略是“仅允许authenticated用户插入”,需确认策略的SQL定义是否完整。在Supabase控制台的SQL编辑器执行以下命令查看策略详情:

SELECT polname, polcmd, rolname, qual, with_check FROM pg_policies WHERE tablename = 'petition';
  • 若with_check字段不为空,说明策略还要求插入的行满足额外条件(比如authorId = auth.uid()),此时需确保你插入的authorId值等于当前认证用户的ID(即session.user.id)。
  • 若策略的with_check为true但仍报错,可能是策略未正确应用,可重新创建策略:
DROP POLICY IF EXISTS "Enable insert for authenticated users only" ON petition;
CREATE POLICY "Enable insert for authenticated users only" ON petition
FOR INSERT TO authenticated
WITH CHECK (true);

3. 确保插入数据的authorId与当前用户匹配

如果你的策略隐含要求authorId必须是当前用户ID(这是常见的安全设计),需修正代码中userId的来源:

const { data: session } = await supabase.auth.getSession();
if (!session?.user) {
  console.error("用户未登录");
  return;
}

const { data, error } = await supabase
  .from("petition")
  .insert([
    {
      title: formData.title,
      recipient: formData.recipient,
      problem: formData.problem,
      solution: formData.solution,
      authorId: session.user.id, // 使用当前认证用户的ID
    },
  ])
  .select();

if (error) {
  console.error("创建请愿失败:", error);
}

4. 检查authenticated角色的基础权限

确保authenticated角色拥有petition表的INSERT权限,执行以下SQL完成授权:

GRANT INSERT ON petition TO authenticated;

内容的提问来源于stack exchange,提问作者Petar Ivcec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:56:10