展开本页目录
开始前准备什么
- 下载独立练习包,使用 Node.js 20+;参考源码没有 npm 第三方依赖,React 库仅 W03/W11 随包提供。
- 在自己的独立目录中运行;所有业务和身份均为虚构教学数据。
- 目标 App、模型、账号授权与外部发布需按本页真实边界另行操作;不使用真实客户资料练习。
- 准备隔离的 Supabase 练习项目
- 通过 Dyad 的官方连接入口授权
- 执行带主键和用户所有权的迁移
- 创建两个真实测试账号和预约
- 运行真实双用户权限矩阵
- 保留跨用户写入负例
- 以数据库结果决定是否交付
独立原创源码、输入、逐步说明、运行脚本和真实本地检查;不含账号密钥或模型权重。
包含七步具体操作、来源与本题未执行范围。
真实执行本题纯函数/结构断言,不代替目标 App、模型、权限或发布测试。
离线 npm ci、check、build 与 HTTP 内容类型回读结果。
1. 准备隔离的 Supabase 练习项目
不要复用真实客户预约库。先读本页 scope 与 fixtures.json:只有两个虚构 UUID 和两条匿名预约;本地页面只是解释每个测试应观察到什么,不执行用户登录或权限隔离。
bash
node verify.mjs2. 通过 Dyad 的官方连接入口授权
在应用详情选择 Connect Supabase,再核对组织和练习项目。授权成功与选择正确项目是两件事。服务端密钥不得放进浏览器源码;本题不提供真实账号、token 或连接成功截图。
3. 执行带主键和用户所有权的迁移
在自己的空练习库审查 schema.sql 后执行。owner_id 关联 auth.users(id),启用 RLS;显式撤销 anon/authenticated 的既有表权限,再只给 authenticated 本题需要的读写权限。SELECT/DELETE 使用 auth.uid()=owner_id,INSERT 用 WITH CHECK,UPDATE 同时约束旧记录和新 owner_id。
bash
cat schema.sql4. 创建两个真实测试账号和预约
用练习账号 A、B 各登录一次,将各自真实用户 UUID 替换夹具占位值。分别通过用户会话插入一条记录。不能用 SQL 管理员或 service_role 查询代替用户会话测试,因为它们可能绕过 RLS。
5. 运行真实双用户权限矩阵
将 Supabase URL、publishable/anon key 与两个短期用户 access token 仅放终端环境,运行 test-rls.mjs。脚本读取自己的记录、尝试读取他人记录、尝试将自己的 owner_id 改为他人、检查匿名读取,并把每个真实状态保存。
bash
node test-rls.mjs6. 保留跨用户写入负例
仅检查返回 200 不够:PostgREST 对无权读取常返回空数组。脚本检查返回记录的 owner_id 和行数;越权 INSERT 与改 owner 必须得到明确的 401/403、SQLSTATE 42501 权限拒绝。跨用户更新/删除与匿名读取只接受明确权限拒绝或 200 空数组;500、无效 JWT 或其他服务错误会使测试失败,不能证明隔离。若失败应先修策略和目标项目,不要在前端加 filter 来掩盖漏洞。
7. 以数据库结果决定是否交付
本包 verification.json 的 status=passed 仅表示本地 SQL/夹具结构检查通过;scope 与 externalAuthorizationExecuted=false 明确说明远端权限测试尚未执行。你必须获得真实双用户矩阵通过后才可宣称隔离成立,并删除练习数据、撤销短期 token。
bash
node verify.mjs怎样确认已经完成
- 已确认本次未运行 Supabase 权限验证;本地断言通过不能证明 RLS。
- 实际接入时用两个真实用户 access token 验证自己的读写与跨用户读写负例。
- 不得将 service_role 或私密模型密钥放浏览器,保留真实结果并清除练习记录。
常见问题
零代码预约系统只在前端筛选用户就安全吗?
不安全。请求者可以改查询。隔离应由数据库 RLS 执行,必须用两个真实用户会话和跨用户负例检验。
Dyad Supabase 登录成功等于权限已经正确了吗?
不等于。登录证明身份,RLS 控制记录访问。本文提供迁移与测试脚本,但本次没有执行远程 Supabase 验证。



