12-操作审计

article
2026年7月17日阅读约 2 分钟227 字

更新于 2026年7月17日

12 操作审计端到端实现任务

执行要求:直接完成只读审计列表、详情、筛选和稳定分页,运行权限、脱敏、HTTP 和前端构建验证后交付。本任务不新增导出或审计修改接口。

共同门禁:不执行数据库草案,不修改 V1,不 DROP/清库或插入客户测试数据;g5b2-mysql 仅用于 SHOW、SELECT 和 EXPLAIN。接口统一使用 X-Trace-Id,缺失时后端生成并写响应头;本次查询日志/错误使用查询 traceId,历史记录的 request_id 仍是原动作 traceId。

1. 目标与完成判定

  • 菜单:系统管理 / 操作审计,仅 ROLE_ADMIN。
  • 路由:/audit。
  • 支持按操作人、角色、动作、对象类型/ID、结果、traceId 和时间范围筛选,服务端分页和稳定排序。
  • 详情仅展示操作人/角色、时间、对象、动作、结果/原因和历史动作 traceId。
  • 审计记录只读、追加式,不允许修改或删除。

2. 开工前必读与现状核对

  1. 设置 PowerShell UTF-8,阅读仓库门禁、需求 V2.0 第 6.2/6.3 节、数据库设计第 9.6/10 节和 tb_audit_log DDL。
  2. 阅读 AuditPage、types、api/http、PageFeedback、权限处理。
  3. 阅读 audit Controller/Service/Mapper/XML、ApiError/TraceIdFilter、ActorContext。
  4. 用 rg 查找 AuditEntry、audits、audit、mapper.audit 和所有写审计调用方。
  5. 当前已有 GET /api/v1/audit 和 GET /api/v1/audit/{id};补齐筛选/分页/脱敏,不创建同义详情接口。

3. 业务规则

  • tb_audit_log.request_id 就是产生该历史动作的 traceId,不新增 requestId/traceId 两套字段。
  • tb_audit_log 没有 publish_status;它是追加式权威操作记录。PUBLISHED 门禁适用于算法和业务结果,不能据此过滤或伪造审计状态。
  • 列表默认 created_at DESC、id DESC;任何可选排序都追加 id 稳定键。
  • 列表和 count 使用完全相同的白名单筛选,返回真实 total。
  • 当前“查询审计列表”请求也有自己的响应 traceId;它与每一行历史动作的 traceId 含义不同,DTO 和页面不得混淆。
  • 详情不存在返回 404;越权返回 403;空列表返回 NO_DATA/空 items,而不是错误。
  • 不返回请求体、响应体、密码、token、密钥、完整文件、SQL、内部堆栈或未在 DDL 中允许的敏感字段。
  • 审计查询本身只写中文访问日志;是否审计只读查询按既有统一策略处理,不递归制造无界审计记录。

4. 后端实施

  1. 两个接口统一 ROLE_ADMIN。
  2. 列表参数支持 operatorId、operatorRole、action、targetType、targetId、result、traceId、startTime、endTime、page、size、sort、direction。
  3. 参数化查询;action/target/result/sort 均白名单,禁止请求值进入 SQL 片段。
  4. Page 的 state.traceId 表示本次查询,items[].traceId 表示历史动作;字段命名和说明明确。
  5. 详情只按主键查询白名单列,不关联并返回业务对象敏感内容。
  6. 中文日志写清查询目的、筛选范围、返回数量和失败原因,不输出整条审计详情。

5. 数据追溯

页面字段 来源
历史动作 traceId(请求号) tb_audit_log.request_id
操作人/角色 operator_id、operator_role
动作和对象 action、target_type、target_id
结果和原因 result、result_reason
时间/稳定键 created_at、id

6. 前端适配

  • 全部筛选、分页和排序真实进入请求;新增 traceId/对象筛选时同步 types 和 service。
  • 列表只显示“traceId(请求号)”一列,不重复显示 requestId。
  • 明确区分页面错误提示中的“本次查询 traceId”和行/详情中的“历史动作 traceId”。
  • 切换筛选或分页时关闭/清空旧详情,避免展示不属于当前结果的记录。
  • 403、NO_DATA、404 和请求错误使用统一状态组件;不在前端拼审计原因。

7. 最小验证门禁

  1. 后端测试覆盖:普通用户 403、管理员空列表、全部筛选、非法排序、时间范围错误、真实 total、稳定分页和详情 404。
  2. 脱敏测试确保响应与日志不含 SQL、token、密码、堆栈和完整请求体。
  3. 只读 EXPLAIN 默认时间排序、operator/action/result/traceId 筛选;记录实际索引选择。
  4. 真实 HTTP 验证成功、NO_DATA、400、403、404,以及请求响应 traceId 与历史行 traceId 的正确区分。
  5. 运行相关 Maven 测试、Mapper XML 检查、注解 SQL 禁止扫描和 cd frontend; npm run build。

8. 交付报告

列出修改文件、最终筛选/分页契约、脱敏检查、HTTP/EXPLAIN/Maven/build 实际结果和未实现项。除非需求另行确认,不新增审计导出能力。