fix: 导出任务场景校验加入按类别拆分的订单导出场景
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m24s

创建导出任务与导出任务列表的 scene 参数用 oneof 写死了允许的场景,order_platform、order_agent、order_online 被参数校验拒绝。
同时修正提案中资产订单接口按授权范围校验企业账号的不准确描述。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
邹进
2026-10-26 14:42:29 +09:00
parent eb9f12d160
commit 71fb91f9bf
6 changed files with 10 additions and 9 deletions

View File

@@ -57,7 +57,7 @@
现状:后台认证允许企业账号;原列表只对代理固定买家条件,`applyOrderScope` 对企业账号不加店铺范围(`GetSubordinateShopIDs` 为空即不限),接口权限中间件(`pkg/middleware/permission.go`)未接入路由,因此企业账号调用列表与详情能看到全部订单。下单已拒绝企业账号(`OrderHandler.Create`),取消只允许代理,导出任务不允许企业账号创建。
做法:在 `OrderHandler` 增加一个内部校验,`List`、三个新列表、`Get`、`PurchaseCheck` 开头调用,企业账号返回 `CodeForbidden`("企业账号无权访问订单")。放在 Handler 而非 Store:Store 的 `applyOrderScope` 被订单相关的其他调用方共用(如资产订单查询、退款),在 Store 拦会影响企业账号合法的资产订单查询。
做法:在 `OrderHandler` 增加一个内部校验,`List`、三个新列表、`Get`、`PurchaseCheck` 开头调用,企业账号返回 `CodeForbidden`("企业账号无权访问订单")。放在 Handler 而非 Store:Store 的 `applyOrderScope` 被订单相关的其他调用方共用(如资产订单查询、退款),在 Store 拦影响面不可控。资产订单接口对企业账号未按授权范围校验,是企业账号仅限 H5 的后续收口事项。
备选:在 `applyOrderScope` 对企业账号加 `1 = 0`。放弃:影响面不可控,且返回空列表而不是无权限,前端无法区分。

View File

@@ -15,7 +15,7 @@
- 代理商订单:后台下单且从代理钱包扣款(`payment_method = wallet`),含代理自购、代理给下级购买、平台代扣代理钱包、代理 OpenAPI 下单。
- 平台订单:后台下单且不走代理钱包,含平台自营、赠送、平台代购(平台代购买家虽记为代理,但线下收款、不扣代理钱包)。
- 新接口与新导出场景的查询参数、分页、响应结构、表头、认证、权限与数据范围与原列表、原导出完全一致,只多一个固定的类别条件。
- **BREAKING** 企业账号不能访问后台订单接口:原列表、三个新列表、订单详情、购买预检对企业账号返回无权限(下单、取消已不允许企业账号)。修复现有问题:企业账号调用订单列表与详情不受任何数据范围限制,能看到全部订单。企业账号查看自己资产的订单继续使用 `GET /api/admin/assets/{identifier}/orders`。
- **BREAKING** 企业账号不能访问后台订单接口:原列表、三个新列表、订单详情、购买预检对企业账号返回无权限(下单、取消已不允许企业账号)。修复现有问题:企业账号调用订单列表与详情不受任何数据范围限制,能看到全部订单。资产订单接口 `GET /api/admin/assets/{identifier}/orders` 本次不改(该接口目前对企业账号未按企业授权范围校验,属于企业账号仅限 H5 的后续收口事项,不在本变更范围)。
- 订单详情、取消、购买预检、后台下单的其他行为不变。
## Capabilities

View File

@@ -88,7 +88,7 @@
### Requirement: 企业账号不能访问后台订单接口
后台订单接口 `GET /api/admin/orders`、`GET /api/admin/orders/platform`、`GET /api/admin/orders/agent`、`GET /api/admin/orders/online`、`GET /api/admin/orders/{id}`、`POST /api/admin/orders/purchase-check` MUST 对企业账号返回无权限错误,不返回任何订单数据。超管、平台、代理账号的行为不变。企业账号查看自己资产的订单 SHALL 继续通过资产订单接口 `GET /api/admin/assets/{identifier}/orders`,该接口按资产数据范围校验。
后台订单接口 `GET /api/admin/orders`、`GET /api/admin/orders/platform`、`GET /api/admin/orders/agent`、`GET /api/admin/orders/online`、`GET /api/admin/orders/{id}`、`POST /api/admin/orders/purchase-check` MUST 对企业账号返回无权限错误,不返回任何订单数据。超管、平台、代理账号的行为不变。资产订单接口 `GET /api/admin/assets/{identifier}/orders` 不在本需求范围,行为不变。
#### Scenario: 企业账号调用订单列表
- **WHEN** 企业账号调用 `GET /api/admin/orders` 或任一新列表接口
@@ -98,6 +98,6 @@
- **WHEN** 企业账号调用 `GET /api/admin/orders/{id}`
- **THEN** 返回无权限错误,不返回订单详情
#### Scenario: 企业账号查看自己资产的订单
- **WHEN** 企业账号调用 `GET /api/admin/assets/{identifier}/orders` 查询本企业资产
#### Scenario: 资产订单接口不受影响
- **WHEN** 企业账号调用 `GET /api/admin/assets/{identifier}/orders`
- **THEN** 行为与本次变更前一致

View File

@@ -16,6 +16,7 @@
- [x] 3.1 `OrderDataSource` 增加类别字段,`NewOrderDataSource(db, category)`;`Scene()` 按类别返回场景,类别为空返回 `order`;`applyFilters` 末尾调用 1.1 的函数(别名 `o`)叠加类别条件
- [x] 3.2 `NewDefaultRegistry` 注册三个类别数据源;`timeFilterScenes` 加入三个新场景(`IsSupportedScene` 无调用方,同步加入保持一致)
- [x] 3.3 `internal/routes/export_task.go` 场景列表说明补充 `order_platform`、`order_agent`、`order_online`
- [x] 3.4 `dto.CreateExportTaskRequest` 与导出任务列表请求的 `scene` 校验(`oneof`)加入 `order_platform`、`order_agent`、`order_online`(测试环境验证时发现漏改,创建新场景导出被参数校验拒绝)
## 4. 构建与文档