# 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 关系(迁移路径) **阶段二:实现** 1. `core` app 增 membership 模型 + 迁移(存量数据自动生成 owner) 2. **服务端强制校验**:TenantMiddleware / 权限层收口——所有租户资源接口验证当前用户对当前租户的 membership(禁止只依赖 query 参数) 3. 切换端点:`POST /api/tenants/{id}/switch`(校验 membership + 审计记录) 4. 成员管理接口:邀请 / 角色变更 / 禁用(owner/admin 分级权限) 5. 前端:租户切换器、成员管理页、无权限页 6. 回归 + 新增用例:跨租户越权矩阵(A 租户用户访问 B 租户资源 → 403/404) ## 三、验收标准 - [ ] 存量数据迁移后,每个租户有且仅有一个 owner(数据核对) - [ ] **越权矩阵用例**:member 访问管理接口 403;非成员访问租户资源 403/404;跨租户读/写全被拒 - [ ] 跨租户切换端到端可用(前端切换器 + 会话隔离无脏数据) - [ ] 成员管理分级正确(admin 不能踢 owner 等边界) - [ ] 既有 460 用例零回归;`makemigrations --check --dry-run` 干净 - [ ] 设计文档与实现一致(评审记录进 PROGRESS) ## 四、验收命令(参考) ```bash 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`(含设计要点、越权矩阵用例输出、迁移核对数据)。