Files
cmautobuy/docs/task/57-管理员自助修改密码.md
T
2026-08-09 16:50:20 +08:00

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 数据库中人工操作;未验证忘记密码恢复,因为不属于本工单范围。

相关提交

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