Files
cmautobuy/docs/task/57-管理员自助修改密码.md
T

75 lines
4.3 KiB
Markdown
Raw Normal View History

2026-08-09 16:50:20 +08:00
# 57 Admin:管理员自助修改密码
- 类型:需求
- 父级大工单:#14
- 所属 MVP / 版本:#15 Admin 四模块可用闭环
- 状态:已完成
- 日期:2026-08-09
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/57
## 背景与目标
唯一管理员原来没有正常的密码修改入口:用户管理页只允许重置采购员密码,不能修改管理员自己的密码。本任务增加管理员自助修改密码能力,要求校验当前密码,并在成功后撤销该账号的全部 Web Session。
## 最终方案
- 在所有业务页的顶部账号区域为管理员显示“修改密码”按钮,采购员不显示。
- 使用公共弹窗收集当前密码、新密码和确认新密码;字段带可见标签、正确的浏览器自动填充语义和明确帮助文字。
- POST `/account/change-password` 同时经过网页登录、管理员权限和 CSRF 防护;目标用户只从当前 Session 获取,忽略表单中的任何用户编号。
- Service 使用 bcrypt 校验当前密码,复用最少 6 个字符、最多 72 个字节及两次输入一致的密码规则。
- Repository 在同一事务中以“用户编号 + 预期旧密码哈希 + 有效管理员”为条件更新密码,并撤销该用户全部 Session,防止并发改密互相覆盖。
- 校验失败后使用 303 返回原业务页:不回显密码,自动重新打开弹窗,在对应字段旁显示错误并聚焦该字段。
- 修改成功后清除当前认证 Cookie、跳转登录页;旧密码和所有旧 Session 均失效。
与建单方案一致。实现没有新增数据库迁移,没有修改 Client 接口,也没有开放采购员自助改密或忘记密码入口。
## 改了哪些
- `admin/templates/partials/header.html`:增加管理员改密入口和可访问的密码弹窗。
- `admin/static/css/app.css`:补充顶部按钮及字段错误样式。
- `admin/handler/web/auth.go`:处理改密结果、清 Cookie 和安全重定向。
- `admin/handler/web/web.go`:注册管理员路由,并为公共顶部模板提供弹窗状态和安全返回地址。
- `admin/service/auth.go`:校验当前密码、新密码和管理员权限,并标记具体错误字段。
- `admin/repository/user.go`:原子更新密码并撤销全部 Session,增加旧哈希并发保护。
- `admin/password_change_integration_test.go`:覆盖界面、CSRF、角色、改密、Cookie 和多 Session 流程。
- `admin/service/auth_test.go`、`admin/handler/web/auth_test.go`、`admin/user_integration_test.go`:补充业务边界和既有页面回归。
- `docs/admin/05-ui-specification.md`、`docs/admin/06-quality-security.md`:同步界面、密码和 Session 安全基线。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| 管理员可从顶部打开修改密码弹窗,采购员无入口 | 通过 |
| 当前密码错误时拒绝修改,原密码和 Session 保持有效 | 通过 |
| 新密码字符数、bcrypt 字节上限和确认值校验明确 | 通过 |
| 成功后旧密码失败、新密码可登录 | 通过 |
| 成功后全部 Web Session 撤销,当前 Cookie 清除 | 通过 |
| 表单不能指定其他用户,采购员直接请求返回 403 | 通过 |
| 无 CSRF 请求返回 403,Client 四接口回归通过 | 通过 |
| 页面、响应、测试输出和文档不包含提交的密码 | 通过 |
| 弹窗标签、自动填充、错误焦点及拖选行为正确 | 通过 |
| Go 全量测试及 Go 1.23.0 验证通过 | 通过 |
## 测试
- 执行的命令:
```powershell
cd D:\chengma\cmautobuy\admin
go vet ./...
go test ./... -count=1
$env:GOTOOLCHAIN="go1.23.0"
go version
go build ./...
go test ./... -count=1
Remove-Item Env:GOTOOLCHAIN
```
- 结果:`go vet` 通过;全部 Go 包测试通过;固定工具链输出 `go version go1.23.0 windows/amd64`,构建和无缓存测试通过。
- Chrome 真实浏览器:在独立临时数据库和 1366×768 视口下,验证入口、初始焦点、密码框拖选、错误回显与清空、错误字段焦点、成功重新登录,全部通过;临时进程和数据已清理。
- **没验证到的部分**:尚未在用户当前浏览器和实际 Admin 数据库中人工操作;未验证忘记密码恢复,因为不属于本工单范围。
## 相关提交
- `008bb876203ec5f3dc9b90c3fb7235ea891bdbd0` feat: 支持管理员自助修改密码 (#57)