# 【管理后台】废弃的产品状态变更端点 `/{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 状态变更成功`(正常放行) ✓
