feat: 支持管理员自助修改密码 (#57)

This commit is contained in:
chengma
2026-08-09 16:49:28 +08:00
parent 2cbb98f09c
commit 008bb87620
12 changed files with 446 additions and 19 deletions
+5 -4
View File
@@ -29,7 +29,7 @@
- SKU 映射复用:第二次匹配同一 SKU 应自动带出;
- 在线状态派生:`last_seen_at` 刚好在边界前后。
- 密码哈希校验:正确密码成功,错误密码失败,数据库不出现明文密码;
- 密码长度边界:5 个字符拒绝、6 个字符接受;初始化、创建和重置规则一致;
- 密码长度边界:5 个字符拒绝、6 个字符接受;初始化、创建、重置和管理员自助修改规则一致;
- 角色校验:管理员可以管理用户,采购员访问用户管理返回 `403`;
- 最后管理员保护:不能禁用最后一个有效管理员。
- 客户端归属:一人多客户端、一台客户端唯一当前负责人、转交/解绑历史完整;
@@ -107,13 +107,14 @@
- `[建议]` MVP 只监听 `127.0.0.1`,不对外暴露。要给内网用再单独评估。
- `[必须]` 不提供固定默认密码和公开注册;第一位管理员由用户首次初始化。
- `[必须]` 密码使用成熟算法哈希,禁止自创加密、明文保存或可逆加密。
- `[必须]` 密码最少 6 个字符、最多 72 个字节;初始化、创建采购员、重置密码
- `[必须]` 密码最少 6 个字符、最多 72 个字节;初始化、创建采购员、重置密码、管理员自助修改
的服务端校验和 HTML 表单约束保持一致。
- `[必须]` 首次管理员创建必须在数据库写事务中完成,并发请求最多一个成功。
- `[必须]` 登录成功后使用新的随机 Session Token,数据库只保存其 SHA-256 哈希。
- `[必须]` 登录 Cookie 设置 `HttpOnly`、`SameSite=Lax`、`Path=/`;HTTPS 部署时设置 `Secure`。
- `[必须]` Session 默认 12 小时过期;退出、密码重置和账号禁用立即撤销对应 Session。
- `[必须]` `/setup`、`/login`、`/logout` 和用户管理写操作都保留 CSRF 防护。
- `[必须]` Session 默认 12 小时过期;退出、密码重置、管理员自助修改密码和账号禁用立即撤销对应 Session。
- `[必须]` 管理员自助修改密码必须验证当前密码,目标账号从当前 Session 取得;成功后撤销该账号全部 Session 并重新登录。
- `[必须]` `/setup`、`/login`、`/logout`、`/account/change-password` 和用户管理写操作都保留 CSRF 防护。
- `[必须]` 客户端绑定、转交、解绑和删除只能由管理员执行,并保留 CSRF 防护。
- `[必须]` Web 登录中间件只保护 HTML 路由,不得覆盖 `/api/v1/client/*`。
- `[建议]` 对连续登录失败做简单限速;错误提示不区分用户名不存在和密码错误。