文件
hyb-oa/.trellis/tasks/09-07-manager-ap-access-scope/prd.md
T

5.6 KiB

经理 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,不是生产状态证明。