2.8 KiB
2.8 KiB
D-01 · 用户-租户 membership + 跨租户切换
| 字段 | 值 |
|---|---|
| 项目 | dealerhub · Desktop/gj/dealerhub(backend + frontend) |
| 优先级 | P0 · M3 |
| 建议模型 | gpt-5.6-luna(先设计) → deepseek-v4.1-flash(实现)/ glm-5.3-flash(回归) |
| 依赖 | 无 |
| 预估 | 3.5 天 |
一、背景(为什么做)
迭代 5 自列的"下一轮最高价值项"第一名(backend/PROGRESS_AGI_ITERATION_5.md):当前缺少用户—租户的服务端 membership/授权关系。这是系统从"能跑"到"能卖"的必经门槛——多租户 SaaS 的授权必须服务端强制,不能只靠前端过滤。
二、目标(交付物)
阶段一:设计文档(gpt-5.6-luna 产出,先评审再动手)
- membership 数据模型:
Membership(user, tenant, role[owner|admin|member], status[active|invited|disabled], joined_at) - 授权矩阵:每个角色对每个资源类别的 读/写/管理 权限表
- 跨租户切换流程:切换端点、会话/令牌携带方式、审计日志
- 兼容策略:存量单租户数据如何映射出 owner 关系(迁移路径)
阶段二:实现
coreapp 增 membership 模型 + 迁移(存量数据自动生成 owner)- 服务端强制校验:TenantMiddleware / 权限层收口——所有租户资源接口验证当前用户对当前租户的 membership(禁止只依赖 query 参数)
- 切换端点:
POST /api/tenants/{id}/switch(校验 membership + 审计记录) - 成员管理接口:邀请 / 角色变更 / 禁用(owner/admin 分级权限)
- 前端:租户切换器、成员管理页、无权限页
- 回归 + 新增用例:跨租户越权矩阵(A 租户用户访问 B 租户资源 → 403/404)
三、验收标准
- 存量数据迁移后,每个租户有且仅有一个 owner(数据核对)
- 越权矩阵用例:member 访问管理接口 403;非成员访问租户资源 403/404;跨租户读/写全被拒
- 跨租户切换端到端可用(前端切换器 + 会话隔离无脏数据)
- 成员管理分级正确(admin 不能踢 owner 等边界)
- 既有 460 用例零回归;
makemigrations --check --dry-run干净 - 设计文档与实现一致(评审记录进 PROGRESS)
四、验收命令(参考)
cd backend && pytest -q # 460+ 全绿
pytest -q -k membership # 新增用例
python manage.py makemigrations --check --dry-run
cd frontend && npm test && npm run build
五、边界(不许做)
- 不做计费/套餐(另一张卡的空间)
- 不改现有单据/库存业务逻辑(只加授权层)
- 不把权限逻辑塞进前端当唯一防线
六、交接
写 PROGRESS_D-01.md(含设计要点、越权矩阵用例输出、迁移核对数据)。