存储

存储访问控制


Supabase Storage 旨在与 Postgres 行级别安全 (RLS) 完美配合。

您可以使用 RLS 创建 安全访问策略,这些策略功能强大且灵活,允许您根据业务需求限制访问。

访问策略#

默认情况下,Storage 不允许在没有 RLS 策略的情况下向 bucket 上传任何内容。您可以通过在 storage.objects 表上创建 RLS 策略来选择性地允许某些操作。

您可以在 此处 找到存储模式的文档,并且为了简化策略创建过程,您可以利用这些 辅助函数

例如,上传对象所需的唯一 RLS 策略是授予 storage.objects 表的 INSERT 权限。

要允许使用 upsert 功能覆盖文件,您还需要授予 SELECTUPDATE 权限。

策略示例#

一个简单的入门方法是为 SELECTINSERTUPDATEDELETE 操作创建 RLS 策略,并限制策略以满足您的安全要求。例如,您可以从以下 INSERT 策略开始

1
create policy "policy_name"
2
ON storage.objects
3
for insert with check (
4
true
5
);

并将其修改为仅允许经过身份验证的用户将资源上传到特定的 bucket,方法是将其更改为

1
create policy "policy_name"
2
on storage.objects for insert to authenticated with check (
3
-- restrict bucket
4
bucket_id = 'my_bucket_id'
5
);

此示例演示了如何允许经过身份验证的用户将文件上传到 my_bucket_id 内部名为 private 的文件夹

1
create policy "Allow authenticated uploads"
2
on storage.objects
3
for insert
4
to authenticated
5
with check (
6
bucket_id = 'my_bucket_id' and
7
(storage.foldername(name))[1] = 'private'
8
);

此示例演示了如何允许经过身份验证的用户将文件上传到 my_bucket_id 内部,文件夹名称为他们的 users.id

1
create policy "Allow authenticated uploads"
2
on storage.objects
3
for insert
4
to authenticated
5
with check (
6
bucket_id = 'my_bucket_id' and
7
(storage.foldername(name))[1] = (select auth.jwt()->>'sub')
8
);

允许用户访问先前由同一用户上传的文件

1
create policy "Individual user Access"
2
on storage.objects for select
3
to authenticated
4
using ( (select auth.jwt()->>'sub') = owner_id );

绕过访问控制#

如果您仅从受信任的客户端(例如您自己的服务器)使用 Storage,并且需要绕过 RLS 策略,您可以在 Authorization 标头中使用 service key。Service key 完全绕过 RLS 策略,授予您对所有 Storage API 的无限制访问权限。

请记住,您不应公开共享 service key。