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

Supabase存储桶无法启用RLS,自定义JWT上传遇签名验证失败

解决方案

1. 解决"signature verification failed"错误

Supabase会自动验证Authorization头中的JWT,使用项目默认的JWT密钥,你用自定义密钥生成的token会导致签名验证失败,按以下步骤修复:

(1)修改前端请求头,使用自定义Header传递token

把自定义token从Authorization头转移到自定义Header(比如X-Custom-Token),避免Supabase自动验证:

export const supabaseAuthClient = () => {
  const userSession = userSessionStore();
  return createClient(supabaseUrl, supabaseAnonKey, {
    global: {
      headers: {
        'X-Custom-Token': userSession?.session?.token || ''
      }
    }
  });
};

(2)修正get_org_id()函数,读取自定义Header并解码token

确保函数读取X-Custom-Token头,并用你Python代码中使用的JWT密钥解码:

CREATE OR REPLACE FUNCTION public.get_org_id()
RETURNS text AS $$
DECLARE
  token text := current_setting('request.headers.x-custom-token', true);
  payload json;
BEGIN
  IF token IS NULL OR token = '' THEN
    RETURN NULL;
  END IF;
  -- 替换成你Python代码里的jwt_secret_key
  payload := jwt.decode(token, 'your-jwt-secret-key', true, 'HS256');
  RETURN payload->'app_metadata'->>'org_id';
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

2. 处理无法启用storage.buckets RLS的问题

storage.buckets表默认归postgres超级用户所有,普通用户无权限修改:

(1)切换到postgres用户执行语句

在Supabase控制台的SQL编辑器中,右上角切换用户为postgres,再执行:

ALTER TABLE storage.buckets ENABLE ROW LEVEL SECURITY;

(2)可选:为storage.buckets添加RLS策略

如果需要限制对桶的访问,可添加策略(比如仅允许访问fontuploads桶):

CREATE POLICY "anon can access fontuploads bucket" ON storage.buckets
FOR SELECT TO anon USING (bucket_id = 'fontuploads');

3. 确保storage.objects的RLS配置正确

(1)确认storage.objects已启用RLS

执行以下语句确保RLS开启:

ALTER TABLE storage.objects ENABLE ROW LEVEL SECURITY;

(2)授予anon用户操作权限

确保anon用户有对应操作权限:

GRANT INSERT, SELECT, DELETE, UPDATE ON storage.objects TO anon;

4. 验证前端上传路径

前端上传文件时,路径必须是{org_id}/文件名格式(比如org_123/font.ttf),这样策略中的split_part("name", '/', 1)才能正确匹配token中的org_id。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 15:33:14