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

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上传限制

排查与修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:55:27