权限管理
PG 模式云存储的权限模型与业务数据库一致:以 anon / authenticated / service_role 三种数据库角色为主体,以 RLS Policy 为唯一闸门,作用于 storage schema 下的元数据表。
storage schema 全景
storage schema 包含以下表:
| 表 | 说明 | 是否对开发者开放 |
|---|---|---|
storage.buckets | Bucket 元数据 | ✅ 可读可写(受 RLS 控制) |
storage.objects | Object 元数据(一行 = 一个对象) | ✅ 可读可写(受 RLS 控制) |
storage.s3_multipart_uploads | S3 兼容分片上传任务 | 只读(anon / authenticated) |
storage.s3_multipart_uploads_parts | 分片明细 | 只读(anon / authenticated) |
storage.migrations | Storage 内部迁移版本 | 不开放(已 REVOKE) |
storage.buckets
CREATE TABLE storage.buckets (
id text PRIMARY KEY,
name text NOT NULL, -- 长度 ≤ 100(由触发器约束)
public boolean DEFAULT false,
avif_autodetection boolean DEFAULT false,
file_size_limit bigint, -- 单文件大小上限(字节)
allowed_mime_types text[], -- 允许的 MIME 白名单
owner_id text, -- 创建者 sub
created_at timestamptz DEFAULT now(),
updated_at timestamptz DEFAULT now()
);
public 字段的真实语义public = true 不会让 PostgreSQL 自动旁路 RLS。它只是元数据上的一个布尔标记,是否真的"公开可读"由你写在 storage.objects 上的 SELECT 策略决定。常见写法:
CREATE POLICY objects_public_read ON storage.objects
FOR SELECT TO anon, authenticated
USING (
EXISTS (
SELECT 1 FROM storage.buckets b
WHERE b.id = storage.objects.bucket_id AND b.public
)
);
storage.objects
CREATE TABLE storage.objects (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
bucket_id text REFERENCES storage.buckets(id),
name text, -- 对象 key,可带 '/'
version text,
owner_id text, -- 上传者 sub
metadata jsonb, -- 系统侧元数据(size / mimetype 等)
user_metadata jsonb, -- 用户自定义元数据
path_tokens text[] GENERATED ALWAYS AS (string_to_array(name, '/')) STORED,
last_accessed_at timestamptz DEFAULT now(),
created_at timestamptz DEFAULT now(),
updated_at timestamptz DEFAULT now()
);
要点: