feat: 声明求职密码库 PostgreSQL 存储
This commit is contained in:
@@ -361,6 +361,36 @@ postgres:
|
|||||||
user: hwlab_jd01_v03_app
|
user: hwlab_jd01_v03_app
|
||||||
address: 74.48.78.17/32
|
address: 74.48.78.17/32
|
||||||
method: scram-sha-256
|
method: scram-sha-256
|
||||||
|
- type: hostssl
|
||||||
|
database: findjob
|
||||||
|
user: findjob
|
||||||
|
address: 10.0.8.0/22
|
||||||
|
method: scram-sha-256
|
||||||
|
- type: hostssl
|
||||||
|
database: postgres
|
||||||
|
user: findjob
|
||||||
|
address: 10.0.8.0/22
|
||||||
|
method: scram-sha-256
|
||||||
|
- type: hostssl
|
||||||
|
database: findjob
|
||||||
|
user: findjob
|
||||||
|
address: 74.48.78.17/32
|
||||||
|
method: scram-sha-256
|
||||||
|
- type: hostssl
|
||||||
|
database: postgres
|
||||||
|
user: findjob
|
||||||
|
address: 74.48.78.17/32
|
||||||
|
method: scram-sha-256
|
||||||
|
- type: hostssl
|
||||||
|
database: findjob
|
||||||
|
user: findjob
|
||||||
|
address: 152.53.229.148/32
|
||||||
|
method: scram-sha-256
|
||||||
|
- type: hostssl
|
||||||
|
database: postgres
|
||||||
|
user: findjob
|
||||||
|
address: 152.53.229.148/32
|
||||||
|
method: scram-sha-256
|
||||||
|
|
||||||
secrets:
|
secrets:
|
||||||
source: master-local
|
source: master-local
|
||||||
@@ -464,6 +494,20 @@ secrets:
|
|||||||
HWLAB_JD01_V03_DB_NAME: hwlab_jd01_v03
|
HWLAB_JD01_V03_DB_NAME: hwlab_jd01_v03
|
||||||
randomHex:
|
randomHex:
|
||||||
HWLAB_JD01_V03_DB_PASSWORD: 32
|
HWLAB_JD01_V03_DB_PASSWORD: 32
|
||||||
|
- name: findjob-db-credentials
|
||||||
|
sourceRef: platform-db/findjob-db.env
|
||||||
|
type: env
|
||||||
|
requiredKeys:
|
||||||
|
- FINDJOB_DB_USER
|
||||||
|
- FINDJOB_DB_PASSWORD
|
||||||
|
- FINDJOB_DB_NAME
|
||||||
|
createIfMissing:
|
||||||
|
enabled: true
|
||||||
|
values:
|
||||||
|
FINDJOB_DB_USER: findjob
|
||||||
|
FINDJOB_DB_NAME: findjob
|
||||||
|
randomHex:
|
||||||
|
FINDJOB_DB_PASSWORD: 32
|
||||||
objects:
|
objects:
|
||||||
roles:
|
roles:
|
||||||
- name: sub2api
|
- name: sub2api
|
||||||
@@ -529,6 +573,15 @@ objects:
|
|||||||
createdb: false
|
createdb: false
|
||||||
createrole: false
|
createrole: false
|
||||||
superuser: false
|
superuser: false
|
||||||
|
- name: findjob
|
||||||
|
passwordRef:
|
||||||
|
sourceRef: platform-db/findjob-db.env
|
||||||
|
key: FINDJOB_DB_PASSWORD
|
||||||
|
login: true
|
||||||
|
attributes:
|
||||||
|
createdb: false
|
||||||
|
createrole: false
|
||||||
|
superuser: false
|
||||||
databases:
|
databases:
|
||||||
- name: sub2api
|
- name: sub2api
|
||||||
owner: sub2api
|
owner: sub2api
|
||||||
@@ -565,6 +618,11 @@ objects:
|
|||||||
encoding: UTF8
|
encoding: UTF8
|
||||||
locale: C.UTF-8
|
locale: C.UTF-8
|
||||||
extensions: []
|
extensions: []
|
||||||
|
- name: findjob
|
||||||
|
owner: findjob
|
||||||
|
encoding: UTF8
|
||||||
|
locale: C.UTF-8
|
||||||
|
extensions: []
|
||||||
|
|
||||||
exports:
|
exports:
|
||||||
connectionStrings:
|
connectionStrings:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
- 账号、简历、岗位和申请状态投影。
|
- 账号、简历、岗位和申请状态投影。
|
||||||
- 图形验证码、短信验证码、真人校验、资料补充和提交确认等人工事项。
|
- 图形验证码、短信验证码、真人校验、资料补充和提交确认等人工事项。
|
||||||
- 统一管理员密码认证、HTTPS 公开入口和受控会话。
|
- 统一管理员密码认证、HTTPS 公开入口和受控会话。
|
||||||
- 招聘账号密码的本地加密保存、按单位生成、查看和复制。
|
- 招聘账号密码在 host PostgreSQL 中按单位明文保存、生成、查看和复制。
|
||||||
- Vite 前端与 Bun API 的 native 热重载开发形态。
|
- Vite 前端与 Bun API 的 native 热重载开发形态。
|
||||||
- 声明式业务状态、本地私密运行状态和外部表单工作流的边界。
|
- 声明式业务状态、本地私密运行状态和外部表单工作流的边界。
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
| 人工事项 | 自动流程需要本人查看、填写或确认后才能继续的任务。 |
|
| 人工事项 | 自动流程需要本人查看、填写或确认后才能继续的任务。 |
|
||||||
| 业务状态 | 可提交到私有仓库的单位、材料和申请公开状态。 |
|
| 业务状态 | 可提交到私有仓库的单位、材料和申请公开状态。 |
|
||||||
| 私密运行状态 | 工作流 ID、验证码 artifact、本人答案和其他不得提交的临时状态。 |
|
| 私密运行状态 | 工作流 ID、验证码 artifact、本人答案和其他不得提交的临时状态。 |
|
||||||
| 招聘密码库 | 以统一管理员密码派生密钥加密、按单位保存招聘账号和密码的本地私密状态。 |
|
| 招聘密码库 | 在 host PostgreSQL 独立数据库中按单位保存招聘账号和明文密码的私密状态。 |
|
||||||
|
|
||||||
## 4. 系统边界
|
## 4. 系统边界
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ flowchart LR
|
|||||||
Career[单位与申请 YAML] --> API[Bun API]
|
Career[单位与申请 YAML] --> API[Bun API]
|
||||||
Tasks[本地人工事项] --> API
|
Tasks[本地人工事项] --> API
|
||||||
Secret[统一密码 sourceRef] --> API
|
Secret[统一密码 sourceRef] --> API
|
||||||
Vault[本地加密招聘密码库] <--> API
|
Vault[host PostgreSQL 明文招聘密码库] <--> API
|
||||||
Workflow[外部表单工作流] <--> API
|
Workflow[外部表单工作流] <--> API
|
||||||
API --> Vite[Vite Web 工作台]
|
API --> Vite[Vite Web 工作台]
|
||||||
Vite --> Edge[HTTPS 公共边缘]
|
Vite --> Edge[HTTPS 公共边缘]
|
||||||
@@ -72,7 +72,7 @@ flowchart LR
|
|||||||
- 端口、启动命令、状态路径和认证来源由求职仓库 `config.json` 拥有。
|
- 端口、启动命令、状态路径和认证来源由求职仓库 `config.json` 拥有。
|
||||||
- 公共域名、TLS upstream 和 health path 由 UniDesk public exposure YAML 拥有。
|
- 公共域名、TLS upstream 和 health path 由 UniDesk public exposure YAML 拥有。
|
||||||
- 私密运行状态只保存在求职仓库 `.state/`。
|
- 私密运行状态只保存在求职仓库 `.state/`。
|
||||||
- 招聘密码库密钥只从统一管理员密码派生,不维护第二个主密码。
|
- 招聘密码库使用受控 Secret sourceRef 连接 host PostgreSQL,不维护第二个主密码。
|
||||||
- 招聘密码明文只在已认证会话的单条显式查看请求中返回。
|
- 招聘密码明文只在已认证会话的单条显式查看请求中返回。
|
||||||
|
|
||||||
## 6. 原子需求
|
## 6. 原子需求
|
||||||
@@ -114,13 +114,14 @@ native 开发应同时保持前端 HMR 和 API 文件监听热重载。服务端
|
|||||||
工作台应为每个单位管理独立招聘账号和密码,并满足以下要求:
|
工作台应为每个单位管理独立招聘账号和密码,并满足以下要求:
|
||||||
|
|
||||||
- 使用密码学安全随机源生成符合指定长度的密码。
|
- 使用密码学安全随机源生成符合指定长度的密码。
|
||||||
- 密码库文件只保存在 `.state/`,文件权限为 `0600`。
|
- 密码库使用 host PostgreSQL 独立数据库和最小权限角色。
|
||||||
- 密码库使用统一管理员密码派生的密钥进行认证加密。
|
- `password_plaintext` 字段直接保存招聘密码明文,不进行应用层或字段级加密。
|
||||||
|
- 数据库连接参数只从受控 Secret sourceRef 读取,不写入仓库。
|
||||||
- 单位列表和密码库摘要只返回账号、密码是否存在和更新时间,不返回密码明文。
|
- 单位列表和密码库摘要只返回账号、密码是否存在和更新时间,不返回密码明文。
|
||||||
- 查看或复制密码必须由已认证用户对单个单位显式触发。
|
- 查看或复制密码必须由已认证用户对单个单位显式触发。
|
||||||
- 前端不得把全部密码预加载到页面状态。
|
- 前端不得把全部密码预加载到页面状态。
|
||||||
- API、CLI、日志、TaskTree、Git 和错误响应不得打印密码明文。
|
- API、CLI、日志、TaskTree、Git 和错误响应不得打印密码明文。
|
||||||
- 更新密码时应覆盖该单位的加密条目,不保留可由普通接口读取的历史明文。
|
- 更新密码时应覆盖该单位的当前明文记录,不保留可由普通接口读取的历史密码。
|
||||||
|
|
||||||
## 7. 验收契约
|
## 7. 验收契约
|
||||||
|
|
||||||
@@ -132,4 +133,4 @@ native 开发应同时保持前端 HMR 和 API 文件监听热重载。服务端
|
|||||||
- 桌面和移动视口均无文本重叠、横向页面溢出或操作按钮不可达。
|
- 桌面和移动视口均无文本重叠、横向页面溢出或操作按钮不可达。
|
||||||
- 正确登录后能为单个单位生成、查看和复制招聘密码。
|
- 正确登录后能为单个单位生成、查看和复制招聘密码。
|
||||||
- 未登录请求、单位列表请求和密码库摘要请求均不能取得密码明文。
|
- 未登录请求、单位列表请求和密码库摘要请求均不能取得密码明文。
|
||||||
- 密码库文件和 Git diff 中不出现招聘密码明文。
|
- Git diff、CLI、日志和 TaskTree 中不出现招聘密码明文。
|
||||||
|
|||||||
Reference in New Issue
Block a user