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

