diff --git a/project-management/PJ2026-04/specs/PJ2026-04-findjob-workbench.md b/project-management/PJ2026-04/specs/PJ2026-04-findjob-workbench.md index 9a6bcf6e..37e1c051 100644 --- a/project-management/PJ2026-04/specs/PJ2026-04-findjob-workbench.md +++ b/project-management/PJ2026-04/specs/PJ2026-04-findjob-workbench.md @@ -22,6 +22,7 @@ - 账号、简历、岗位和申请状态投影。 - 图形验证码、短信验证码、真人校验、资料补充和提交确认等人工事项。 - 统一管理员密码认证、HTTPS 公开入口和受控会话。 +- 招聘账号密码的本地加密保存、按单位生成、查看和复制。 - Vite 前端与 Bun API 的 native 热重载开发形态。 - 声明式业务状态、本地私密运行状态和外部表单工作流的边界。 @@ -41,6 +42,7 @@ | 人工事项 | 自动流程需要本人查看、填写或确认后才能继续的任务。 | | 业务状态 | 可提交到私有仓库的单位、材料和申请公开状态。 | | 私密运行状态 | 工作流 ID、验证码 artifact、本人答案和其他不得提交的临时状态。 | +| 招聘密码库 | 以统一管理员密码派生密钥加密、按单位保存招聘账号和密码的本地私密状态。 | ## 4. 系统边界 @@ -59,6 +61,7 @@ flowchart LR Career[单位与申请 YAML] --> API[Bun API] Tasks[本地人工事项] --> API Secret[统一密码 sourceRef] --> API + Vault[本地加密招聘密码库] <--> API Workflow[外部表单工作流] <--> API API --> Vite[Vite Web 工作台] Vite --> Edge[HTTPS 公共边缘] @@ -69,6 +72,8 @@ flowchart LR - 端口、启动命令、状态路径和认证来源由求职仓库 `config.json` 拥有。 - 公共域名、TLS upstream 和 health path 由 UniDesk public exposure YAML 拥有。 - 私密运行状态只保存在求职仓库 `.state/`。 +- 招聘密码库密钥只从统一管理员密码派生,不维护第二个主密码。 +- 招聘密码明文只在已认证会话的单条显式查看请求中返回。 ## 6. 原子需求 @@ -104,6 +109,19 @@ native 开发应同时保持前端 HMR 和 API 文件监听热重载。服务端 账号注册可在本人授权和验证码完成后执行。每人限报一个、提交后不可修改或其他高影响岗位申请只能保存草稿,最终提交前必须生成人工确认事项。 +### 6.9 FJ-REQ-009 招聘密码库 + +工作台应为每个单位管理独立招聘账号和密码,并满足以下要求: + +- 使用密码学安全随机源生成符合指定长度的密码。 +- 密码库文件只保存在 `.state/`,文件权限为 `0600`。 +- 密码库使用统一管理员密码派生的密钥进行认证加密。 +- 单位列表和密码库摘要只返回账号、密码是否存在和更新时间,不返回密码明文。 +- 查看或复制密码必须由已认证用户对单个单位显式触发。 +- 前端不得把全部密码预加载到页面状态。 +- API、CLI、日志、TaskTree、Git 和错误响应不得打印密码明文。 +- 更新密码时应覆盖该单位的加密条目,不保留可由普通接口读取的历史明文。 + ## 7. 验收契约 - 未登录打开正式 HTTPS 入口时只显示登录界面。 @@ -112,3 +130,6 @@ native 开发应同时保持前端 HMR 和 API 文件监听热重载。服务端 - 图形验证码事项能显示受控图片并把值传入对应工作流,页面和日志不回显验证码。 - 修改前端源码后 HMR 连接保持可用,修改 API 源码后服务自动重载。 - 桌面和移动视口均无文本重叠、横向页面溢出或操作按钮不可达。 +- 正确登录后能为单个单位生成、查看和复制招聘密码。 +- 未登录请求、单位列表请求和密码库摘要请求均不能取得密码明文。 +- 密码库文件和 Git diff 中不出现招聘密码明文。