Supabase RLS 上线清单,独立开发者先堵住表暴露
按官方 Row Level Security 文档启用策略、回收默认授权并看守 service_role,再对照 Free 暂停与备份边界决定是否升 Pro。
MVP 常见事故是表开了匿名密钥却忘了行级安全。任何人用公开密钥就能读到别人的行,有时还能写。Supabase 把 Postgres RLS 放在核心路径上。本文不讨论和 Firebase 谁更适合做后端选型,只讨论上线前怎样按官方文档把 RLS 验收做完,以及 Free 方案的暂停与备份边界何时逼你升级。材料锚定 2026-09-26 的定价页与 Row Level Security 指南。
先理解危险默认值
RLS 指南写得很直。暴露 schema 里的表如果没有启用 RLS,而角色又有授权,数据就可以被读和写。只加策略并不自动收回已经存在的授权。对仍默认授予 anon 与 authenticated 的项目,需要显式回收不需要的权限。service_role 拥有完整访问并绕过 RLS,必须留在服务端。
独立开发者常用浏览器里的公开密钥直连。这条路径依赖 RLS 与正确授权。把 service_role 写进前端、移动端或仓库明文,等于关掉大门后把钥匙钉在门上。
新项目建表向导有时会提醒启用 RLS。旧项目或手写 SQL 建表更容易漏。把启用 RLS 写成迁移文件的固定尾句,比依赖记忆可靠。
上线前五步验收
第一步,对每个会经 API 暴露的表执行启用 RLS。第二步,按应用真实需要授予 anon 与 authenticated 的 select、insert、update、delete,不需要的权限回收。第三步,为每种操作写策略,登录用户常用 auth.uid() 约束到本人行。第四步,在测试目录写允许与拒绝用例,覆盖匿名与登录、增删改查。第五步,跑数据库测试,修到红灯清零。
策略句子要短。用户读自己的 profile,插入时 owner 必须是自己。改他人 owner 字段的路径直接关掉。复杂的管理操作走服务端,用 service_role 在受控环境执行,并打审计日志。不要为了省事写一条永远为真的策略。
存储桶与数据库表分开想。文件路径若包含用户编号,也要有对应策略,避免枚举 URL 下载他人对象。Realtime 订阅同样会碰到权限,上线前用第二个账号测一次,确认看不到他人的行。
Free 方案能撑到哪里
定价页写明 Free 为每月 0 美元,含无限 API 请求、五万月活用户、500MB 数据库、5GB egress、1GB 文件存储等,并注明项目约一周不活跃会暂停,活跃项目上限为两个。Pro 从约每月 25 美元起,面向生产扩容。Free 适合验证,不适合把无备份、可暂停当成长期生产承诺。
RLS 在 Free 与 Pro 都可用。升级解决的是稳定性、容量与协作,不是付费才有安全。安全做完仍停在 Free,只是你接受暂停与恢复风险。安全没做就升 Pro,只是给事故付了月费。
两个 Free 项目的常见拆法是开发与生产各一。开发环境也要启用 RLS,否则你会在开发库养成坏习惯,合并到生产时原样复制漏洞。
何时不该只靠 RLS,何时不该上线
RLS 不替代服务端校验、风控与配额。涉及支付、管理员模拟登录、跨租户报表,必须有服务端边界。若合规要求数据不出境或需要签约 SLA,Free 的社区支持与暂停规则可能不够,应在架构阶段就换方案。若团队没人会读 SQL 策略,先补最小测试,再谈功能堆砌。
本地用种子数据测策略时,至少准备两个用户。一个用户的成功,不能证明另一个用户的失败。把失败用例写进 CI,比发版前人工点一点更可靠。
场景化默认推荐
个人工具只有自己登录,仍启用 RLS,并拒绝匿名写。多租户 SaaS,按 owner 或 org_id 写策略,管理操作走服务端。内容站只读公开表,匿名可 select 已发布行,写操作仅服务端。已有用户数据却发现从未启用 RLS,先只读模式止血,再补策略与轮换密钥,不要边营业边裸奔。
当前结论。Supabase MVP 默认启用 RLS,回收多余授权,service_role 仅服务端,用允许与拒绝测试验收。Free 可验证,商业持续运行要正视暂停与备份缺口。策略以当天官方文档为准。
发版检查里加一行。打开表列表,确认暴露表均已启用 RLS,并抽查一条拒绝用例。缺这一行,其他功能清单都偏乐观。密钥泄露演练每年至少做一次,轮换公开密钥与服务端密钥的步骤写进运维文档。
若使用 Edge Functions,记住函数里若误带 service_role 对外返回数据,RLS 帮不上忙。函数的返回值按最小字段输出,日志避免打印整行用户数据。安全是多层的,RLS 是其中必须打开的一层,不是唯一一层。
把常见策略模板放进仓库 docs,新表按模板改字段名。模板不能替代测试,但能降低周五晚上临时写策略的错误率。
把升级决定写成一句话放进团队频道置顶也可以。收款后必须离开 Hobby,未收款且用量健康则留下。这句话不替代官网条款,只替代每次争论时从头翻聊天记录。若你使用多人预览评论,记得评论者不一定需要部署权,权限最小化能减少误发生产的概率。
把升级决定写成一句话放进团队频道置顶也可以。收款后必须离开 Hobby,未收款且用量健康则留下。这句话不替代官网条款,只替代每次争论时从头翻聊天记录。若你使用多人预览评论,记得评论者不一定需要部署权,权限最小化能减少误发生产的概率。
把升级决定写成一句话放进团队频道置顶也可以。收款后必须离开 Hobby,未收款且用量健康则留下。这句话不替代官网条款,只替代每次争论时从头翻聊天记录。若你使用多人预览评论,记得评论者不一定需要部署权,权限最小化能减少误发生产的概率。
把升级决定写成一句话放进团队频道置顶也可以。收款后必须离开 Hobby,未收款且用量健康则留下。这句话不替代官网条款,只替代每次争论时从头翻聊天记录。若你使用多人预览评论,记得评论者不一定需要部署权,权限最小化能减少误发生产的概率。
文中工具
