# 权限直连审计记录 **文档状态**:当前审计证据,用于 R3 发布前权限直连审计。 **对应 Issue**:`issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv` / R3。 ## 1. 审计目标 本轮验证 A7 的导航收口没有掩盖服务端授权缺口。直连页面或 API 时,用户只能访问其角色授权或数据范围内的内容;前端隐藏不能替代服务端权限。 ## 2. 自动化覆盖 新增 `client/tests/e2e/permission-direct-access.spec.ts`,覆盖: - 页面直连:`/budgets`、`/ap-operations`、`/system/integrations/erp`、`/travel-requests`、`/invoice-pool`、`/contracts-registry`、`/payment-batches`。 - API 直连:`/api/budgets`、`/api/ap-operations`、`/api/payment-batches`、`/api/integrations/erp/master-data/status`、`/api/invoice-pool`、`/api/travel-requests`、`/api/contracts-registry`、`/api/auth/wecom/config`。 - 角色:普通员工、主管、财务、财务主管、管理员。 ## 3. 权限矩阵 | 角色 | 直连路径/API | 期望 | 自动化结论 | | --- | --- | --- | --- | | 普通员工 | 预算、AP、ERP、付款批次 | 页面进入 `/403`;API 返回 `403` 或功能门禁 `409`,不得返回业务数据 | 通过 | | 普通员工 | 差旅、票据、合同台账 | 可以进入自助或范围型页面;接口必须收敛到本人、本人票据、本人项目或功能门禁 | 通过 | | 主管 | AP、ERP、付款批次 | 页面进入 `/403`;API 返回 `403` 或功能门禁 `409`,不得返回业务数据 | 通过 | | 主管 | 预算 | 允许访问角色授权范围 | 通过 | | 财务 | 票据、付款/AP | 允许访问财务授权范围或功能门禁 | 通过 | | 财务 | ERP 管理 | 页面和 API 均拒绝 | 通过 | | 财务主管/管理员 | ERP 或系统配置 | 允许访问授权范围;配置探活不得返回 `secret/password/token` 明文字段 | 通过 | 说明:AP 和付款批次接口存在 feature gate;当功能门禁先返回 `409` 时,结论是“未泄露数据”,但不等同于证明权限拒绝。 ## 4. 验证命令 ```bash cd client && npm run typecheck cd client && npm run build cd client && npm run test:e2e -- permission-direct-access.spec.ts settings-governance.spec.ts login-portal-ux.spec.ts --workers=1 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv git diff --check ``` ## 5. 执行结果 2026-05-10 已执行: - `cd client && npm run typecheck`:通过。 - `cd client && npm run build`:通过。 - `cd client && npm run test:e2e -- permission-direct-access.spec.ts settings-governance.spec.ts login-portal-ux.spec.ts --workers=1`:本地服务启动后通过,10 passed。 - `python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv`:通过。 - `git diff --check`:通过。 第一次 E2E 执行失败原因为 `http://127.0.0.1:3000` 未启动;启动本地 OA 服务后重跑通过,未发现权限泄漏。R3 可进入完成状态,下一步才允许进入 R4 只读部署预检。