无需登录 数据私有 本地保存

Storage Buckets API 演示 - 分离存储空间与策略

2
0
0
0
Buckets

← 选择一个 Bucket 查看详情

管理存储策略和文件
Public Bucket(公开存储空间)

文件可通过公开URL直接访问,无需认证。适合存储头像、公共图片、CDN资源等。

https://<project>.supabase.co/storage/v1/object/public/bucket-name/file.jpg
✅ 无需签名Token  |  ✅ CDN友好  |  ⚠️ 任何人可访问
Private Bucket(私有存储空间)

需要签名URL或认证令牌才能访问文件。适合存储用户文档、敏感数据、内部资源等。

https://<project>.supabase.co/storage/v1/object/authenticated/bucket-name/file.pdf?token=...
🔒 需签名Token  |  🔒 支持过期时间  |  ✅ 安全可控
常见问题与知识点

Storage Bucket 是云存储中的容器概念,类似于一个文件夹,用于组织和管理文件。

分离存储空间与策略 意味着:Bucket 本身负责存储文件(物理存放),而访问策略(Public/Private)独立定义谁能访问这些文件。你可以随时更改 Bucket 的访问策略,而不需要迁移文件。

例如:一个名为 avatars 的 Bucket 可以设置为 Public(允许公开访问头像图片),而 invoices Bucket 设置为 Private(仅认证用户可下载发票PDF)。两者物理存储机制相同,但访问控制策略不同。

特性Public BucketPrivate Bucket
URL路径/public/bucket-name/.../authenticated/bucket-name/...
访问方式直接URL访问,无需认证需要签名Token或认证Header
签名URL过期不适用可设置过期时间(如60秒后失效)
适用场景CDN资源、公共图片、静态网站素材用户私有文件、敏感文档、付费内容
安全性低(URL可被分享)高(需签名验证)

签名URL是一种带有加密签名的临时访问链接,用于安全地授予对 Private Bucket 中文件的访问权限。

生成方式(Supabase SDK):
const { data } = await supabase
.storage
.from('private-docs')
.createSignedUrl('file.pdf', 60) // 60秒过期
console.log(data.signedUrl)
签名URL包含HMAC签名和时间戳,过期后自动失效,防止链接被长期滥用。

RLS 策略可以与 Storage 配合,实现更细粒度的访问控制:

Bucket级别策略:决定整个Bucket是公开还是私有。
RLS策略:在数据库层面控制谁可以对存储对象执行操作(SELECT/INSERT/UPDATE/DELETE)。

例如:你可以设置一个 Private Bucket,同时通过 RLS 策略确保用户只能下载自己上传的文件,即使他们拿到了别人的签名URL也无法访问。

这种双层安全架构使得存储空间管理既灵活又安全。

可以随时切换,使用 Supabase API 更新 Bucket 的 public 属性即可。

对已有文件的影响:
• Public → Private:之前可公开访问的URL会立即失效,需要重新生成签名URL。
• Private → Public:文件变为公开可访问,所有知道URL的人都可以下载。

⚠️ 注意:将Private Bucket切换为Public时,请确保其中不包含敏感数据,因为切换后所有文件URL将不再需要签名验证。

  • 分离关注点:为不同类型资源创建不同Bucket(如avatarsdocumentsbackups),而不是全部混在一个Bucket中。
  • 最小权限原则:默认创建Private Bucket,仅在有公开需求时才设为Public。
  • 文件大小限制:通过API或RLS策略设置上传文件的大小上限,防止滥用。
  • 签名URL短过期:为Private文件生成签名URL时,设置合理的过期时间(如5分钟),而非过长有效期。
  • CDN缓存策略:对于Public Bucket中的静态资源,配置合理的Cache-Control头以优化加载速度。
  • 定期审计:定期检查Public Bucket中是否有敏感信息被误公开。