存储访问控制
Supabase Storage 旨在与 Postgres 行级别安全 (RLS) 完美配合。
您可以使用 RLS 创建 安全访问策略,这些策略功能强大且灵活,允许您根据业务需求限制访问。
访问策略#
默认情况下,Storage 不允许在没有 RLS 策略的情况下向 bucket 上传任何内容。您可以通过在 storage.objects 表上创建 RLS 策略来选择性地允许某些操作。
您可以在 此处 找到存储模式的文档,并且为了简化策略创建过程,您可以利用这些 辅助函数。
不同操作所需的 RLS 策略记录在 此处
例如,上传对象所需的唯一 RLS 策略是授予 storage.objects 表的 INSERT 权限。
要允许使用 upsert 功能覆盖文件,您还需要授予 SELECT 和 UPDATE 权限。
策略示例#
一个简单的入门方法是为 SELECT、INSERT、UPDATE、DELETE 操作创建 RLS 策略,并限制策略以满足您的安全要求。例如,您可以从以下 INSERT 策略开始
1create policy "policy_name"2ON storage.objects3for insert with check (4 true5);并将其修改为仅允许经过身份验证的用户将资源上传到特定的 bucket,方法是将其更改为
1create policy "policy_name"2on storage.objects for insert to authenticated with check (3 -- restrict bucket4 bucket_id = 'my_bucket_id'5);此示例演示了如何允许经过身份验证的用户将文件上传到 my_bucket_id 内部名为 private 的文件夹
1create policy "Allow authenticated uploads"2on storage.objects3for insert4to authenticated5with check (6 bucket_id = 'my_bucket_id' and7 (storage.foldername(name))[1] = 'private'8);此示例演示了如何允许经过身份验证的用户将文件上传到 my_bucket_id 内部,文件夹名称为他们的 users.id
1create policy "Allow authenticated uploads"2on storage.objects3for insert4to authenticated5with check (6 bucket_id = 'my_bucket_id' and7 (storage.foldername(name))[1] = (select auth.jwt()->>'sub')8);允许用户访问先前由同一用户上传的文件
1create policy "Individual user Access"2on storage.objects for select3to authenticated4using ( (select auth.jwt()->>'sub') = owner_id );绕过访问控制#
如果您仅从受信任的客户端(例如您自己的服务器)使用 Storage,并且需要绕过 RLS 策略,您可以在 Authorization 标头中使用 service key。Service key 完全绕过 RLS 策略,授予您对所有 Storage API 的无限制访问权限。
请记住,您不应公开共享 service key。