展开本页目录
开始前准备什么
- 下载独立练习包,保留 starter、reference 和原始输入。
- Python 3与浏览器可运行本地参照;原生验证需自有Supabase项目及两名测试用户。
- 使用Lovable和自有Supabase需相应账号/额度,两者账单分开;本地参照可独立运行。
- 准备用户与对象权限矩阵
- 让 Lovable 生成私有桶与策略
- 运行本地 Storage 参考并上传
- 以第二用户尝试跨对象读写
- 签发短期链接并匿名读取
- 核对到期与缓存边界
- 分开验收本地行为与原生 RLS
starter、任务提示、具体输入、作者人工可运行参考与独立验证;不含账号/密钥/运行时数据库。
按本文环境运行,再对照原始输入和正反例。
1. 准备用户与对象权限矩阵
解压 inputs/任务合同和 supabase/policies.sql。两名测试用户必须分别拥有自己的对象目录;本地示例 a/b 是公开测试标识,不是认证。
2. 让 Lovable 生成私有桶与策略
在你拥有的 Lovable/Supabase 测试项目按 TASK.md 提示生成私有桶、RLS 与 UI,审查实际变更再批准。本文未连接或变更云端项目。
交给目标 AI 工具的任务提示
使用独立测试 Supabase 项目和 private bucket。按用户目录设 storage.objects 策略,用户 A 不得读取/覆盖 B 的对象;给本人文件生成短期 signed URL。不要 public bucket,不把 service key 放前端;给出 RLS SQL、浏览器双会话验证和链接过期测试。3. 运行本地 Storage 参考并上传
运行 python3 reference/server.py --port 0,打开输出端口。选 A,路径 a/memo.txt,点“上传/覆盖”和“读取本人文件”,应得到 201 与本人列表。
4. 以第二用户尝试跨对象读写
切换 B 后列表应只显示 b/plan.txt;保留目标 a/memo.txt 再点授权下载/上传,两个请求都要被服务器拒绝,不能只隐藏按钮。
5. 签发短期链接并匿名读取
切回 A 为本人对象生成 3 秒链接;切到 B 后点“无用户标识读取链接”,有效期内返回 200。这是持有链接访问,不代表 B 获得了直接授权。
6. 核对到期与缓存边界
等到签发时间后超过 3 秒再次请求,应为 403。请求禁缓存;已下载的文件不会因链接到期消失。退出登录也不自动撤销已颁发链接。
7. 分开验收本地行为与原生 RLS
运行 python3 reference/verify.py 回读本地 HTTP。原生 RLS 另按 permission-contract.json 和 verify-contract.mjs 在自有项目验收,禁止 service_role;本地通过不能替代 Supabase 原生通过。
怎样确认已经完成
- A/B 直接授权请求只能读取本人对象,跨用户列出/下载/覆盖被拒绝;不是只隐藏按钮。
- signed URL 在期限内可按持有链接访问,到期新请求失败;记录实际时间/状态并关闭缓存干扰。
- 客户端 bundle/包无 service-role key;参考 mock 通过不能替代真实 Storage/RLS 验收。
常见问题
Lovable 做的文件上传怎么让别人看不到?
切换 B 后列表应只显示 b/plan.txt;保留目标 a/memo.txt 再点授权下载/上传,两个请求都要被服务器拒绝,不能只隐藏按钮。
Supabase 私有文件链接退出登录后为什么还能打开?
等到签发时间后超过 3 秒再次请求,应为 403。请求禁缓存;已下载的文件不会因链接到期消失。退出登录也不自动撤销已颁发链接。
哪些结果已执行,哪些仍需原生账号验证?
本地 HTTP Storage 参照已实跑:本人上传、跨用户读写拒绝、签名链接有效期与到期拒绝。Lovable/Supabase Auth/Storage/RLS 未执行;包内 SQL/原生测试合同不能视为已验证策略。





