存储访问控制
Supabase Storage 专为与 Postgres 行级安全性 (RLS) 完美配合而设计。
您可以使用 RLS 创建极其强大灵活的安全访问策略,根据业务需求限制访问权限。
访问策略
默认情况下,Storage 不允许向没有 RLS 策略的存储桶上传文件。您可以通过在 storage.objects
表上创建 RLS 策略来选择性允许特定操作。
您可以在此处查阅存储模式的文档,为了简化策略制定流程,还可以使用这些辅助函数。
不同操作所需的 RLS 策略记录在此处
例如,上传对象唯一需要的 RLS 策略是授予 storage.objects
表的 INSERT
权限。
要允许使用 upsert
功能覆盖文件,您还需要额外授予 SELECT
和 UPDATE
权限。
策略示例
快速入门的方法是创建针对 SELECT
、INSERT
、UPDATE
、DELETE
操作的 RLS 策略,并限制这些策略以满足您的安全需求。例如,可以从以下 INSERT
策略开始:
12345create policy "policy_name"ON storage.objectsfor insert with check ( true);
然后修改为仅允许认证用户上传资源到特定存储桶:
12345create policy "policy_name"on storage.objects for insert to authenticated with check ( -- 限制存储桶 bucket_id = 'my_bucket_id');
这个示例展示如何允许认证用户上传文件到 my_bucket_id
中名为 private
的文件夹:
12345678create policy "允许认证用户上传"on storage.objectsfor insertto authenticatedwith check ( bucket_id = 'my_bucket_id' and (storage.foldername(name))[1] = 'private');
这个示例展示如何允许认证用户上传文件到 my_bucket_id
中以他们 users.id
命名的文件夹:
12345678create policy "允许认证用户上传"on storage.objectsfor insertto authenticatedwith check ( bucket_id = 'my_bucket_id' and (storage.foldername(name))[1] = (select auth.uid()::text));
允许用户访问之前由同一用户上传的文件:
1234create policy "个人用户访问权限"on storage.objects for selectto authenticatedusing ( (select auth.uid()) = owner_id::uuid );
绕过访问控制
如果您仅从受信任的客户端(如您自己的服务器)使用存储服务,并且需要绕过行级安全(RLS)策略,可以在Authorization
请求头中使用service key
。服务密钥会完全绕过RLS策略,授予您对所有存储API的无限制访问权限。
请注意,切勿公开分享服务密钥。