启用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
相关产品推荐
相关产品推荐

