Supabase文件上传偶发失败,触发RLS策略403错误求助
Supabase存储上传偶发403 RLS策略错误排查与解决
问题说明
- 偶发现象:文件上传时有时成功有时失败,失败时返回错误:
{statusCode: '403', error: '', message: 'new row violates row-level security policy (USING expression) for table "objects"'} - 配置背景:
- 基于官方Next.js上传组件修改,仅调整了
htmlFor、id、accept属性和桶URL - 图片、视频两个桶配置了相同RLS策略,以
avatars桶为例,SQL配置如下:insert into storage.buckets (id, name) values ('avatars', 'avatars'); create policy "Avatar images are publicly accessible." on storage.objects for select using (bucket_id = 'avatars'); create policy "Anyone can upload an avatar." on storage.objects for insert with check (bucket_id = 'avatars'); - 使用TypeScript开发,代码无语法错误,所有文件均未超过50MB上传限制
- 基于官方Next.js上传组件修改,仅调整了
排查与修复方案
1. 完善RLS插入策略
当前插入策略仅限制了桶ID,若项目要求用户认证上传,需补充用户身份校验;若允许匿名上传,需确保策略逻辑无遗漏。修改后的策略示例:
-- 需认证上传的场景 create policy "Anyone can upload an avatar." on storage.objects for insert with check ( bucket_id = 'avatars' AND auth.uid() IS NOT NULL ); -- 允许匿名上传的场景 create policy "Anyone can upload an avatar." on storage.objects for insert with check (bucket_id = 'avatars');
注意:视频桶需替换bucket_id为对应桶ID,确保两个桶的策略配置一致。
2. 确认桶的RLS启用状态
检查所有目标桶是否开启RLS,避免因RLS未启用导致的策略冲突:
-- 查询桶的RLS状态 select id, name, enabled from storage.buckets; -- 开启目标桶的RLS update storage.buckets set enabled = true where id in ('avatars', '你的视频桶ID');
3. 校验上传时的用户认证状态
偶发失败可能与用户会话不稳定有关,上传前添加认证状态检查:
const { data: { user } } = await supabase.auth.getUser(); if (!user) { // 处理未认证逻辑,如提示用户登录 return; } // 执行文件上传操作
4. 核对上传参数的桶ID准确性
确认上传代码中指定的桶ID与策略中的桶ID完全一致(区分大小写),避免因拼写错误触发策略校验失败。
5. 通过Supabase日志定位细节
登录Supabase控制台,进入「日志」模块筛选存储相关错误日志,查看403错误的具体触发条件,快速定位策略校验不通过的原因。
内容的提问来源于stack exchange,提问作者Mintee
相关产品推荐
相关产品推荐

