docs(changelog): 管理后台废弃 action 端点拒绝上架/下架动作 (product-v2 审计 PR #3292/#3297)

这个提交包含在:
API Changelog Bot 2026-06-01 11:01:42 +08:00
父节点 07a74ab643
当前提交 5ed175efe1

查看文件

@ -0,0 +1,51 @@
# 【管理后台】废弃的产品状态变更端点 `/{id}/action` 现拒绝上架/下架方向动作
> **类型**: 后端安全收敛(废弃端点动作白名单)
> **服务**: hl-product-service-v2
> **日期**: 2026-06-01
> **影响范围**: `POST /admin/product/item/{id}/action`(产品状态变更-旧端点)
> **归属**: 后端已改(PR #3292 + #3297 → dev,已同步 dev-v3)
> **状态**: 已部署测试服并验证通过
> **关联工单**: 无(审计驱动修复)
> **需前端配合**: ⚠️ 是(若管理后台仍在用该旧端点做上架/下架)
---
## 一、背景(安全问题)
审计发现旧端点 `POST /admin/product/item/{id}/action` 把前端传入的 `action` 直接喂给状态机,**未做动作合法性收敛**。任何持有该产品数据权限的普通管理员,只要传 `action=DIRECT_PUBLISH`,即可:
- 跳过审批流程
- 跳过行程完整性 / 车型必填的硬校验
- 把一个行程为空的产品**瞬间上架**到小程序端
属于「审批绕过 + 越权 + 校验缺失」三合一,必须收敛。
## 二、后端改动
该端点本就标了 `@Deprecated`。现在加入**动作白名单**:
- ✅ **仅放行** `WITHDRAW`(撤回,PENDING_REVIEW → DRAFT,把权限往回收,无风险)
- ❌ **拒绝** 所有上架/下架/审批方向动作(`DIRECT_PUBLISH` / `SUBMIT_PUBLISH` / `UNPUBLISH` / `FORCE_UNPUBLISH` 等),返回:
```json
{ "code": 400406, "message": "动作「DIRECT_PUBLISH」不允许通过该接口执行,上架/下架请改用 toggle-publish 接口", "success": false }
```
## 三、前端需要做(mmg)
**如果管理后台目前是用 `/{id}/action` 这个端点做产品上架/下架/提交审批,需要改用下面的专用端点**(这些端点已存在、且内置了审批 + 完整性校验 + 超管权限判断,是正确做法):
| 原来(旧端点)走 action | 改用专用端点 |
|---|---|
| 上架 / 下架(`DIRECT_PUBLISH`/`SUBMIT_PUBLISH`/`UNPUBLISH`/`FORCE_UNPUBLISH`) | `POST /admin/product/item/{id}/toggle-publish`(后端按当前状态 + 操作人角色自动判方向:超管直接上下架,普通用户走提交审批) |
| 完成设计(CUSTOM 定制产品) | `POST /admin/product/item/{id}/complete` |
| 撤回(PENDING_REVIEW → DRAFT) | 仍可用 `/{id}/action``WITHDRAW`,或一并迁到对应交互 |
> 如果管理后台**已经在用 `toggle-publish` / `complete`**(而 `/action` 只用于撤回或根本没在用),则**无需任何改动**,本次纯属后端堵漏。请前端确认一下当前上架/下架走的是哪个端点。
## 四、测试服实测(经网关 9443 + 真 admin token)
- `action=DIRECT_PUBLISH``400406` 拒绝,产品未上架 ✓
- `action=SUBMIT_PUBLISH``400406` 拒绝 ✓
- `action=WITHDRAW``200 状态变更成功`(正常放行) ✓