Supabase配置仅认证用户插入RLS策略后已登录仍插入失败
问题原因及解决方案
核心问题原因
- 表名拼写不一致:创建表时使用的表名为
submission(单数),后续开启RLS、配置策略、客户端插入操作均使用submissions(复数),若为实际操作中的拼写错误会导致策略配置未生效在目标表上。 - 缺失角色操作权限:RLS是行级安全过滤规则,生效前提是当前操作的
authenticated角色已经拥有目标表的INSERT权限,仅配置RLS策略未授权的情况下依然会被权限系统拦截。
解决方案
- 修正表名不一致问题,确保所有操作指向同一张表:
-- 删除错误创建的单数名表(如果存在) drop table if exists submission; -- 统一创建复数名的目标表 create table submissions ( stuff text );
- 开启表的RLS(如果还未开启):
alter table submissions enable row level security;
- 给
authenticated角色授予表的INSERT权限,可按需补充其他操作权限:
-- 仅授予插入权限 grant insert on public.submissions to authenticated; -- 若同时需要查询、更新、删除权限可执行以下语句 -- grant select, insert, update, delete on public.submissions to authenticated;
- 配置插入RLS策略,原有策略逻辑正确可直接使用:
CREATE POLICY "Enable insert for authenticated users only" ON public.submissions FOR INSERT WITH CHECK (auth.role() = 'authenticated');
配置完成后重新执行客户端插入操作即可正常写入数据。
可选排查项
如果以上配置完成后依然报错,可以解码请求携带的JWT,确认以下信息:
- JWT的
exp字段未过期 - JWT的
role字段值为authenticated - 客户端初始化Supabase时使用的是anon public key,不是service_role key(service_role key会默认绕过RLS,不适合客户端使用)
内容的提问来源于stack exchange,提问作者KevinTale
相关产品推荐
相关产品推荐

