From cb6fa7328eaae580ce7b53df0de21232b03f6f00 Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Mon, 11 May 2026 10:39:35 +0800 Subject: [PATCH] =?UTF-8?q?fix=20notice:=20PR=20#1934=20share=20=E9=89=B4?= =?UTF-8?q?=E6=9D=83=E6=94=B9=E5=A4=9A=E8=A7=92=E8=89=B2=20union=20?= =?UTF-8?q?=E6=9F=A5=20CUSTOMIZER=20=E5=B7=B2=E4=BF=AE=20+=20QA=20?= =?UTF-8?q?=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:PermissionService.hasPermission 只查 currentRoleId 单角色 + Redis 24h 缓存, 与多角色业务不符。修复:ProductShareService 改读 AdminBasicDTO.roleKeys union 集合 查 CUSTOMIZER。wx (8 角色) + lixiaosong (单角色) 双正例 200 通过。 --- ...fix_admin_product-share-role-based-auth.md | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 changelogs/2026-05/11_fix_admin_product-share-role-based-auth.md diff --git a/changelogs/2026-05/11_fix_admin_product-share-role-based-auth.md b/changelogs/2026-05/11_fix_admin_product-share-role-based-auth.md new file mode 100644 index 0000000..3c4feed --- /dev/null +++ b/changelogs/2026-05/11_fix_admin_product-share-role-based-auth.md @@ -0,0 +1,81 @@ +# 后端 fix 通知 — 产品分享鉴权改为多角色 union 查 CUSTOMIZER + +**日期**: 2026-05-11 +**类型**: 后端鉴权逻辑修复 (PR #1919 内部 follow-up) +**模块**: 产品管理 → 产品列表 → 分享产品 +**通知**: @mmg +**前端是否需改动**: **否**(接口契约零变化) +**严重性**: P0(用户 3 次反馈,核心功能不可用) + +--- + +## ⚠️ 关键变化 + +PR #1919 上线后用户实测「自己作为定制师角色 → 点分享 → 后端返 403 无产品分享权限」。 + +**PR #1934(commit `e6cc3d73`)** 已合 dev + 测试服已部署 + QA 双正例通过。 + +### 根因 +- `PermissionService.hasPermission` 只查 `admin.currentRoleId` **单角色** + Redis 24h 缓存 +- admin 可挂多角色,实测 wx 持 8 个角色,但旧逻辑只看 currentRoleId 单角色查权限点 +- 与「持 CUSTOMIZER 角色就能分享」的业务直觉不符 + +### 修复 +- `ProductShareService.share` 第一步从 `hasPermission(PRODUCT_SHARE)` 改为 + **`AdminBasicDTO.roleKeys 含 CUSTOMIZER`**(union 多角色) +- 与第二步 `targetAdmin.roleKeys` 校验**同一套数据源**,语义统一 +- 删 `PERM_PRODUCT_SHARE` 常量(不再消费该权限点) + +### 业务规则 +**有 CUSTOMIZER 角色 → 可分享**(union 多角色判断)。 +不需要再单独绑定 PRODUCT_SHARE 权限点 — 历史 V_003 / V_001 的权限绑定保留不删,只是不再被消费。 + +--- + +## 接口契约零变化 + +`POST /admin/product/item/{id}/share` 入参 / 响应字段 / 错误码语义 0 改动,前端无需任何变更。 + +### 错误文案微调 + +| 旧 | 新 | +|----|-----| +| `无产品分享权限 (PRODUCT_SHARE)` | `无产品分享权限, 仅持定制师角色 (CUSTOMIZER) 可分享产品` | + +如果前端 toast 有匹配旧文案的 if-else(不太可能),需要同步调整。直接显示 `message` 字段无需改。 + +--- + +## ✅ 测试服已验证(2026-05-11 10:36+) + +| 测试主体 | 角色 union | 接口 | 结果 | +|---|---|---|---| +| **wx**(adminId=2021059720172838914) | `ADMIN, CUSTOMER_SERVICE, CUSTOMIZER, MATERIAL_ADMIN, OPERATOR, ROOM_MANAGER, SUPER_ADMIN, VEHICLE_MANAGER` (8 角色) | `POST /admin/product/item/2045018534152478721/share` `{"targetAdminId":1002}` | 200, newProductId=2053665899663024129, "游牧的森林·南线经典(来自wx的分享)" | +| **lixiaosong**(adminId=2033349910786715649) | `CUSTOMIZER` (单角色) | `POST /admin/product/item/2044704111294672897/share` `{"targetAdminId":1002}` | 200, newProductId=2053665998405316609, "嗨冰雪3.0南线(6天5晚)(来自lixiaosong的分享)" | + +两个典型 admin 都成功,产品名中文全角括号正确,无回归。 + +--- + +## 不影响范围 + +- 接口路径 / Method / Request / Response schema 零变化 +- 第二步 targetAdmin 校验(roleKeys 含 CUSTOMIZER)逻辑不变,继续 union 多角色 +- `admin_permission` 表 PRODUCT_SHARE 权限点 + role binding 不删,历史兼容 +- 其他业务模块(如订单分配定制师 / 工单等)未受影响 + +--- + +## 相关 PR + +| PR | 说明 | 状态 | +|----|------|------| +| #1919 | 实现 admin 分享产品功能(Closes #1918) | ✅ 已合 | +| #1924 | 修 #1919 的中文括号 + fee_item 丢数据 | ✅ 已合 + 部署 | +| #1930 | customizers 接口加 enterpriseWechatName | ✅ 已合 + 部署 | +| #1933 | customizers 字段兜底 username + CUSTOMIZER 加 PRODUCT_SHARE 权限 | ✅ 已合 + 部署(但因单 currentRoleId + Redis 缓存原因实际未生效) | +| **#1934** | **本通知**:share 鉴权改为多角色 union 查 CUSTOMIZER(根本性修复) | ✅ 已合 + 部署 + QA 通过 | + +--- + +**联系人**: wx