# 授权记录备注修改权限修复 - 设计 ## 目标 1. 代理用户无法修改非本人创建的授权记录备注。 2. 企业用户无法修改任何授权记录备注。 3. 平台/超级管理员可修改任意授权记录备注。 4. 任何情况下都必须满足数据可见性(代理只能在自己店铺企业范围内操作)。 ## 现状与风险点 - 备注更新当前仅按 `id` 更新,缺少“创建者/可见性”约束。 - 现有数据权限 callback 主要作用于 Query,不覆盖 Update,因此必须在业务链路显式校验。 ## 方案 ### 1) Service 层统一鉴权 在 `AuthorizationService.UpdateRecordRemark` 内新增权限判断: - 取当前用户信息(user_id/user_type/shop_id/enterprise_id) - 先通过 `GetByIDWithJoin` 获取授权记录详情(包含 `authorized_by`、`enterprise_id` 等) - 按规则判断: - 平台/超级管理员:允许 - 代理: - 必须 `record.AuthorizedBy == 当前 user_id` - 且授权记录对应企业必须属于当前店铺(`enterprise.owner_shop_id == shop_id`,可通过 join 查询或使用现有原生 SQL 结果) - 企业:直接拒绝 ### 2) Store 层更新增加约束(防御性) 提供一个“带约束”的更新方法(示例语义): - 平台路径:`UpdateRemarkByID(id, remark)` - 代理路径:`UpdateRemarkByIDAndAuthorizedBy(id, remark, userID)`(必要时再加 enterprise 范围约束) 确保即使上层遗漏判断,也难以越权更新成功。 ### 3) 错误与返回 - 无权限:返回统一错误码(例如 `CodeForbidden`),错误信息使用中文并可被前端直接展示。 ## 验收标准 - 平台用户可修改任意授权记录备注。 - 代理用户仅可修改自己创建的授权记录备注;修改他人创建的记录必须失败。 - 企业用户调用修改备注接口必须失败。 - 新增/更新用例后相关集成测试通过。