存储策略与访问控制:用 RLS 机制守护文件 文件同样需要权限控制——「用户只能下载自己的文件」「付费内容只有付费用户能看」。本节讲解 Storage 如何复用第 5 章的 RLS 机制,实现细粒度的文件访问控制。 存储策略:RLS 的延伸 Storage 的访问控制并不另起炉灶,而是复用 RLS 的理念:存储桶本身关联一组「存储策略」(storage policies),它们与数据表的行级安全策略本质相同——都是基于当前用户身份的布尔表达式,决定某次操作是否放行。
文件同样需要权限控制——「用户只能下载自己的文件」「付费内容只有付费用户能看」。本节讲解 Storage 如何复用第 5 章的 RLS 机制,实现细粒度的文件访问控制。
Storage 的访问控制并不另起炉灶,而是复用 RLS 的理念:存储桶本身关联一组「存储策略」(storage policies),它们与数据表的行级安全策略本质相同——都是基于当前用户身份的布尔表达式,决定某次操作是否放行。
关键概念对应:
| 数据表 RLS | 存储策略 |
|---|---|
| 作用对象是表的行 | 作用对象是桶里的对象(路径) |
| 判断依据是行的列(如 user_id) | 判断依据是对象的路径与元信息 |
| 基于 JWT 中的用户 id | 同样基于 JWT 中的用户 id |
| 覆盖 SELECT/INSERT/UPDATE/DELETE | 覆盖读(下载/列表)与写(上传/改/删) |
正因为机制一致,你在第 5 章学到的策略设计经验可直接迁移到 Storage。
存储策略的核心技巧是把归属编码进路径。例如约定所有用户文件都放在以用户 id 开头的路径下:
users/{用户id}/avatar.png users/{用户id}/documents/report.pdf
这样,策略就能基于「路径前缀」判断归属:「只允许操作以 users/{当前用户id}/ 开头的对象」。这与数据表中「只允许操作 user_id 等于当前用户的行」是同构的。
借鉴第 5 章的数据表模式,存储也有几种典型策略:
适合用户私人文档、个人上传内容。
适合网站公开图片、头像等。
适合付费内容、临时协作用文件。
思路与第 5 章 RBAC 一致,在策略中加角色判断。
和数据表的 INSERT 策略类似,存储的上传策略也要防止冒名——否则用户 A 可以上传到 users/B/ 路径下,冒充 B。因此上传策略应强制:新对象的路径前缀必须匹配当前用户 id。
这与数据表中「INSERT 的 WITH CHECK 要求 user_id = 当前用户」是同一思想:写入时的归属必须由服务端强制,不能信任客户端传的路径。
当归属无法仅靠路径表达时(如「协作者也能访问某文档的附件」),可以借助数据库表:
这样存储策略能与业务数据表联动,表达任意复杂的权限规则——例如「该文件所属的项目,当前用户是否是成员」。
私有桶里一次下载的完整流程:
授权集中在生成签名 URL 时完成一次,下载本身高效。
把存储安全浓缩为一份清单:
users/{id}/...),策略据此判断。除了权限,还要防范滥用:
存储策略复用 RLS 机制,基于 JWT 与路径实现细粒度文件权限;路径编码归属、上传强制前缀匹配、复杂规则借助元数据表,是与数据表 RLS 同构的安全模型。把它用足,文件访问就能像数据访问一样安全可控。
至此,第 7 章完成了对文件存储的全面讲解。第 8 章将进入边缘函数,学习如何用 Serverless 代码承载更复杂的后端逻辑。