60 行
5.6 KiB
Markdown
60 行
5.6 KiB
Markdown
# 经理 AP 财务台账与付款汇总访问收紧
|
|
|
|
## Goal
|
|
|
|
仅收窄 AP 财务台账与付款汇总的全量读取入口:只有经理/付款复核职责的账号不得借付款复核权限访问全公司 AP 数据;保留既有财务读取及经理、CEO 正常审批和付款复核能力;CEO 角色本身不授予全量读取。
|
|
|
|
2026-09-07 用户已批准 AP-only 方案实施,附修订:使用 finance.ledger.view 专用权限,不使用 CEO 角色分支。原授予 ceo、finance、finance_mgr;2026-09-08 身份确认后用户批准修订为仅 finance、finance_mgr,保留 admin 通配,ceo 审批与复核不变。另批准限定员工经理关系只读查询;不写生产、不部署。
|
|
|
|
## 已确认事实与边界
|
|
|
|
- 用户确认系统管理员、经理、财务、员工是不同业务角色;授权按角色和权限表达,不硬编码个人账号。
|
|
- `server/src/constants/permissions.js` 中 manager 和 ceo 均有 `payment.batch.review`;manager 另有六个 `*.view_all`。本轮不调整这些全量查看权限。
|
|
- `server/src/routes/apOperations.js` 的两个 GET 路由共用四选一读取守卫,其中包含 `payment.batch.review`;台账调用 `listFinanceLedger` 时只传 Prisma 与查询条件,没有传当前员工范围。
|
|
- `client/tests/e2e/permission-direct-access.spec.ts` 留有经理 AP 读取预期拒绝、实际返回 200 的本地合成测试证据。业务现已明确拒绝经理仅凭复核职责获取 AP 全量数据;不将此失败改成接受 200。
|
|
- 当前 AP 导出使用独立的 `payment.batch.manage` / `risk.review.manage` 守卫,不包含 `payment.batch.review`。本轮保留既有导出边界,不为 CEO 或经理新增导出权限。
|
|
- 未证明实际生产部署与当前源码一致,未证明经理访问过无关数据,不宣称发生过泄露。
|
|
|
|
## Scope
|
|
|
|
- 范围:AP 汇总、报销财务台账两个后端读取入口;对应前端直连保护、导航与入口投影;相关正反权限测试和既有权限规约。
|
|
- AP 导出仅作旁路负例和既有授权不变验证,不重构导出流程。
|
|
|
|
## Out of Scope
|
|
|
|
- 不修改报销、请假、考勤、采购、资产、项目的 `view_all`,不设计本人/部门/审批链可见范围,不重构付款批次自身的数据范围。
|
|
- 明确保留的开口:本轮完成后,经理仍可从报销列表查看全部报销。这是待业务另行决定的权限范围,不得在交付中宣称“经理只能看相关单据”已经全局实现。
|
|
- 门禁 33 文件包不变,58 条不逐条修,合同阶段 B、R1、场景 8 继续暂停。业务包接收确认独立待办,不属于本任务交付。
|
|
|
|
## Requirements
|
|
|
|
- R1:仅持经理/付款复核职责、没有其他 AP 全量授权的账号访问两个 AP GET 接口必须被后端拒绝,不返回汇总、台账或计数;不得仅靠隐藏前端菜单。
|
|
- R2:仅 finance、finance_mgr 通过专用权限保留两个接口的全量读取;仅 CEO 角色拒绝;旧付款/风险权限码本身不再隐含读取。不得通过授予 CEO 付款管理等写权限实现读取,也不得删除经理的 `payment.batch.review`。
|
|
- R3:经理原有正常审批、付款复核及独立复核约束不变。前端提供既有付款复核入口,不以恢复 AP 全量访问解决导航问题。
|
|
- R4:多角色按显式授权并集合成;manager 与已授权财务角色组合不得因包含 manager 被一票否决。系统管理员身份不自动等同财务权限。
|
|
- R5:查询参数、日期、关键词、分页不能绕过 AP 读取守卫。导出保持原权限,不将 CEO 全量读取等同导出或写入授权。
|
|
- R6:实施与部署分别批准;实现后须只读独立权限复核,主会话验证不能冒充独立复核。
|
|
|
|
## Acceptance Criteria
|
|
|
|
- [ ] 普通员工、仅经理及仅 CEO 角色对两个 GET 均被拒绝;功能开启时为 403,关闭时可保留既有无数据 409。拒绝路径不调用财务数据查询。
|
|
- [ ] finance、finance_mgr 正例通过;manager+财务及 ceo+财务组合保留其财务授权;仅系统管理员不新增授权。
|
|
- [ ] 日期、状态、关键词等查询组合不能改变拒绝结果;经理 AP 导出仍拒绝,既有导出角色不退化。
|
|
- [ ] 经理付款复核正例及原有独立复核负例通过;不扩大其付款执行、组批或其他写权限。
|
|
- [ ] 前端 AP 直连被阻止、导航不暴露不可用入口,经理付款复核入口仍可达;仅 CEO 的 AP 入口拒绝,财务 AP 入口保留。
|
|
- [ ] 六个 view_all 未修改,交付明确“仅 AP 收窄”,不冒充所有业务单据范围收窄。
|
|
- [ ] 针对性验证与只读独立复核有记录;无部署、生产查询或写入,除非另获明确授权。
|
|
|
|
## Test Plan
|
|
|
|
- Fastify inject:两个 AP GET、筛选组合、旧权限码反例、专用权限正例、feature-off、无权时零财务查询。
|
|
- 角色与导航单测:经理、CEO、财务、财务经理、系统管理员、多角色;保持经理付款入口。
|
|
- 既有 AP 导出及付款复核回归:保留独立授权、制单/复核分离及 CEO 无新增导出权。
|
|
- 本地合成浏览器:经理和 CEO 直连 403 和零 AP 请求、财务/财务经理/混合角色进入 AP 和台账、经理付款页保留;零重试、trace,排除合同用例及其他红项。
|
|
- 前端 typecheck、隔离目录 build、语法、diff、治理检查。扩大付款回归需既有固定 BIFF8 Python 依赖,不改产品逻辑绕过环境缺项。
|
|
- 独立只读权限复核待用户;inline 主会话自检不冒充独立复核。
|
|
|
|
## Notes
|
|
|
|
- 本文及 design.md 的专用权限修订已获实施批准;验证结果见 implement.md,不是生产状态证明。
|