feat(history): scope export tasks to owners

This commit is contained in:
lingniu
2026-07-16 17:00:33 +08:00
parent a2722e4afd
commit 38b056f5f1
18 changed files with 528 additions and 100 deletions

View File

@@ -1,14 +1,17 @@
# 车辆数据中台客户 Scope API 覆盖矩阵
更新时间2026-07-14
更新时间2026-07-16
状态:安全审计与实施设计;尚未开放客户主体
状态:本地客户主体与车辆/时间 Scope 已实施OneOS 联邦身份仍按后续接口契约接入
## 1. 当前结论
车辆中台当前的 Bearer Token 只表达 `viewer/operator/admin` 功能角色,不表达客户或车辆数据范围。
因此,即使 OneOS 已能登录客户,也不能直接把客户 token 映射成 `viewer`:这会让客户读取全量车辆、轨迹、
告警、统计及其他人的导出文件
车辆中台已支持本地 `admin/customer` 账号、菜单权限、车辆 VIN Scope 和授权有效时间。认证中间件把
`subjectId/userType/customerRef/tenantRef/authProvider` 以及当前车辆授权注入 `Principal`;车辆、监控、轨迹、
历史、里程和导出入口均在服务端校验主体与时间边界。客户不能通过 Query、Header 或 Body 自行覆盖 customer ID
OneOS 身份尚不能直接映射为本地 `viewer`。后续只有在 OneOS 提供签名、受众、身份版本和客户关联等稳定接口后,
才能映射为同一强类型 Principal在此之前继续使用车辆中台本地客户账号不读取或修改 OneOS 业务逻辑。
2026-07-14 已只读核验 ECS 当前运行状态:
@@ -17,7 +20,7 @@
- `/opt/lingniu-vehicle-platform/env/platform.env` 权限为 `0600 root:root`
- `lingniu-vehicle-platform` 服务已启用且正在运行。
该配置能阻止匿名访问普通平台 API但不能提供客户级隔离
该配置负责内部静态 token客户级隔离由平台账号、会话、菜单和车辆授权表共同提供
## 2. 独立发现:高德服务端接口绕过平台鉴权
@@ -126,26 +129,21 @@ VIN 集合,设置数量上限后再生成参数化过滤。不能先从 TDengi
禁止应在服务端 capability 层返回 403不能只隐藏前端菜单。
### 5.3 导出必须单独重构后才能开放
### 5.3 导出 owner、异步 Scope 与审计(已实施)
当前导出实现有四个 P0 问题
1. `CreateHistoryExport` 没有 `context`,创建时无法固化主体;
2. `HistoryExportJob` 没有 owner/customer/scope version
3. `ListHistoryExports` 返回全局任务;
4. `HistoryExportFile(id)` 只校验 ID 和完成状态,知道 ID 即可下载。
整改要求:
release `export-owner-scope-20260716165737` 已完成
- `Create/List/Download` 全部接收 context 和 Principal
- Job 固化 `owner_subject_id``customer_id``scope_version`、已解析 VIN、时间范围和审计 request ID
- 创建任务时校验每个 VIN,异步执行前再次校验
- 列表只返回当前 owner下载同时校验 owner 和当前授权,越权返回 404
- 客户停用、车辆授权撤销或 Scope 失效时停止未完成任务并拒绝下载;
- 文件名和 CSV 元数据不得包含其他客户信息;文件按 owner 隔离目录并设置 `0640`
- 定期清理过期文件与 jobs 记录。
- Job 固化 owner ID、账号、角色/用户类型、认证来源、客户/租户、已解析 VIN 和逐车时间范围
- 创建时同步校验每个 VIN 和历史授权时间;异步开始、每 5,000 行及下载前重新校验客户账号与车辆授权
- 非管理员列表只返回当前 owner越权或猜测下载 ID 返回 404管理员保留审计视角
- 客户停用、车辆授权撤销或授权区间变化会停止未完成任务并拒绝历史文件下载;
- CSV 文件使用 `0640`任务索引原子持久化CSV 元数据包含创建账号、角色、客户、车辆 Scope、查询条件与生成时间
- Web 使用带 Bearer Token 的 Blob 下载,不再通过无 Authorization 的直接链接;
- 服务重启后 owner、Scope 和完成文件仍可复核,执行中任务安全失败并要求重新创建。
在上述改造完成前,客户主体不授予 `export:create``export:download`
自动化已覆盖两个互斥客户、管理员审计、IDOR、撤权停止和持久化元数据。生产真实导出在重启前后文件
SHA-256 一致,伪造 ID 返回 404且无 `.part` 文件残留。
## 6. 当前 Scope 与历史 Scope 的边界
@@ -189,6 +187,6 @@ customer_id, vin, contract_id, valid_from, valid_to, source_version
2. 引入强类型 QueryScope先改车辆解析与单车详情
3. 改所有列表、汇总、地图、统计和 TDengine 查询;
4. 改告警详情 IDOR、逆地理编码鉴权限流
5. 重构导出 owner 与异步 Scope
6. 完成双客户自动化测试和生产影子查询
7. 最后为测试客户启用 capabilities默认保持客户入口关闭
5. 导出 owner 与异步 Scope:已完成
6. 双客户导出自动化与生产管理员实车导出:已完成;完整客户 API 矩阵继续补齐
7. 本地测试客户可按菜单和车辆授权启用OneOS 联邦客户入口保持关闭,等待正式身份接口