4.3 KiB
4.3 KiB
57 Admin:管理员自助修改密码
- 类型:需求
- 父级大工单:#14
- 所属 MVP / 版本:#15 Admin 四模块可用闭环
- 状态:已完成
- 日期:2026-08-09
- Gitea 工单:#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 验证通过 | 通过 |
测试
-
执行的命令:
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 数据库中人工操作;未验证忘记密码恢复,因为不属于本工单范围。
相关提交
008bb876203ec5f3dc9b90c3fb7235ea891bdbd0feat: 支持管理员自助修改密码 (#57)