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

