---
date: 2026-05-07
tags: [audit, compliance, sox, gdpr, performance]
---

# 审计装饰器覆盖缺口（合规风险）

## 现象

用户在绩效模块改数据，审计日志页一条记录都没新增。

## 根因

`AuditLogInterceptor` 走的是**白名单**模式 ——
[audit-log.interceptor.ts:50-52](../backend/src/core/observability/audit/interceptors/audit-log.interceptor.ts) 里：

```ts
if (!isAuditable) return next.handle();  // 没标装饰器就完全跳过
```

只有控制器方法上显式 `@Auditable()` 才记录。这是设计选择，不是 bug —— 否则 GET 请求会爆炸。

但**新写的业务模块开发者经常忘记加装饰器**，导致合规漏洞。截至 2026-05-07 扫描：

- **绩效 (performance)**：9 个 controller，0 个 `@Auditable` —— **整个模块不留痕**
- **会议考勤 (meeting-attendance)**：0 个装饰器（前端有 audit-logs 页但后端没接入）
- **同步类内部任务**（dingtalk/sap 定时跑的部分）：0 个

## 高敏感缺口举例（应补 `@Sensitive`）

绩效相关的"必须留痕"操作：评分调整、周期开/关、校准结果、战略目标增删改、KPI 调整、360 评估提交。

## 怎么发现

```bash
# 扫描所有 controller 但没装饰器的写操作
grep -rL "@Auditable" backend/src/modules/<module>/**/*.controller.ts
# 或者反过来：找改数据的 endpoint
grep -rE "@(Post|Put|Patch|Delete)" backend/src/modules/<module>/ | wc -l
grep -rE "@Auditable" backend/src/modules/<module>/ | wc -l
# 两个数字差距 = 漏标个数
```

## 怎么避免

新增 controller 写操作时**默认加上**：
- 任何写操作（POST/PUT/PATCH/DELETE）→ `@Auditable()` 起步
- 涉及金额/财务 → 加 `@Financial()`
- 涉及权限/敏感数据/审批结果 → 加 `@Sensitive()`

考虑加一条 lint 规则或 PR 检查：写操作没 `@Auditable` → CI 警告。

## 关联

- 拦截器代码：[backend/src/core/observability/audit/interceptors/audit-log.interceptor.ts](../backend/src/core/observability/audit/interceptors/audit-log.interceptor.ts)
- Schema 含 SOX 合规字段：`isFinancial / complianceLevel / retentionYears / previousHash / currentHash / signature`，但**前提是装饰器要标全**，否则字段再完整也没数据写进去
