根因:PermissionService.hasPermission 只查 currentRoleId 单角色 + Redis 24h 缓存, 与多角色业务不符。修复:ProductShareService 改读 AdminBasicDTO.roleKeys union 集合 查 CUSTOMIZER。wx (8 角色) + lixiaosong (单角色) 双正例 200 通过。
3.5 KiB
3.5 KiB
后端 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