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

Supabase Bucket上传头像报错:违反objects表行级安全策略

Supabase Bucket上传头像RLS策略报错解决办法

问题描述

向Supabase Bucket上传头像时触发报错:new row violates row-level security policy for table "objects",已完成用户认证但上传失败,在storage.objects中添加了策略(role() = 'authenticated'::text)但无效,上传代码如下:

try {
  const { data, error } = await supabase.storage
    .from("/public/avatars")
    .upload(`${values.email}.png`, values.avatar, {
      cacheControl: "3600",
      upsert: true,
    });
  if (error) throw error;
} catch (error) {
  console.log(error);
}

解决方案

1. 修正RLS策略配置

你之前的策略只指定了角色条件,但缺少操作类型限定和Bucket匹配条件,导致策略无法正确匹配上传请求。

在Supabase控制台的SQL编辑器执行以下策略语句(替换avatars为你的实际Bucket名称):

CREATE POLICY "允许认证用户上传头像到avatars桶" ON storage.objects
FOR INSERT TO authenticated
WITH CHECK (bucket_id = 'avatars' AND role() = 'authenticated');

或者通过可视化界面配置:

  • 进入storage.objects表的RLS策略页面
  • 新建策略,选择INSERT操作
  • 角色选择authenticated
  • 添加条件:bucket_id = '你的Bucket名称'
  • 保存并启用策略

2. 修正上传代码中的Bucket路径

supabase.storage.from()的参数是Bucket名称,不是完整路径。你写的/public/avatars是错误的,应该直接用Bucket名avatars(public是Bucket的访问级别,无需写在路径里)。修正后的代码:

try {
  const { data, error } = await supabase.storage
    .from("avatars")
    .upload(`${values.email}.png`, values.avatar, {
      cacheControl: "3600",
      upsert: true,
    });
  if (error) throw error;
} catch (error) {
  console.log(error);
}

3. 验证关键配置

  • 确认storage.objects表的RLS已开启(控制台表设置中查看)
  • 确认新建的策略处于启用状态(策略列表中检查是否激活)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:05:31