Admin:实现首次管理员初始化与网页登录 #50

Closed
opened 2026-08-09 13:14:56 +08:00 by ila · 3 comments
Owner

基本信息

  • 状态:已完成
  • 类型:需求
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 / MVP
  • 阶段:Admin 登录与最小账号管理

要解决什么

Admin 业务网页当前无需登录即可访问。需要实现首次管理员初始化和网页登录,同时保证 Client API 路由完全不经过 Web 登录中间件。

做什么 / 不做什么

  • 做:v6 迁移;users/web_sessions Repository;首次管理员初始化;登录、退出、Session;Web 认证中间件;初始化和登录页面;相关测试。
  • 不做:不做采购员管理页面,不做公开注册、API Key、Client 登录、复杂 RBAC、刷新令牌和 HTTPS 部署。

怎么做

  • 在 admin/repository/db.go 末尾追加 v6,不能修改 v1–v5;同步 schema 自检和迁移测试。
  • 使用固定版本、兼容 Go 1.23.0 的 golang.org/x/crypto/bcrypt 保存密码哈希,不自行设计密码算法。
  • Session Token 使用 32 字节安全随机数;Cookie 保存原文,数据库只保存 SHA-256 哈希;默认 12 小时过期。
  • 增加 repository/user.go、service/auth.go、handler/web/auth.go 和 templates/auth/。
  • /setup 只在 users 为空时可用;创建过程使用写事务重新检查,两个并发请求最多一个成功。
  • Web 公开路由、受保护路由和 /api/v1/client/* 分组注册;Web 中间件不得挂到整个 Engine。
  • 登录 Cookie 使用 HttpOnly、SameSite=Lax、Path=/;HTTPS 时启用 Secure。
  • 所有 POST 保留 CSRF;退出后删除当前 Session。

预计修改:admin/go.mod、admin/go.sum、admin/repository/db.go、admin/repository/user.go、admin/service/auth.go、admin/handler/web/auth.go、admin/handler/web/web.go、admin/main.go、admin/templates/auth/* 及对应测试。

验收标准

  • 全新库访问业务页面会进入初始化页。
  • 不存在固定默认密码,密码明文不进入数据库和日志。
  • 首次管理员并发初始化最多一个成功,完成后初始化入口永久关闭。
  • 正确密码可登录,错误密码使用统一提示。
  • 未登录不能访问业务网页,登录后可以访问。
  • 退出或 Session 过期后不能继续访问。
  • Cookie 和 Session 哈希满足基线要求。
  • /api/v1/client/* 不经过 Web 登录中间件。
  • 能从所有已发布 schema 状态迁移到 v6。
  • Go 1.23.0 下构建、测试和 vet 通过。

怎么验证

从 admin/ 执行:

$env:GOTOOLCHAIN="go1.23.0"
go vet ./...
go build ./...
go test ./... -count=1
Remove-Item Env:GOTOOLCHAIN

还要运行首次初始化并发测试、旧库迁移测试和页面认证测试;不得调用真实 Client 或执行采购。

风险和回退

涉及数据库迁移和网页登录。迁移只追加新表,回退代码时保留表不删;测试必须覆盖 v1–v5 的现实库状态。Web 中间件误挂 API 会中断 Client,必须在本工单和回归工单双重验证。

## 基本信息 - 状态:已完成 - 类型:需求 - 父级大工单:#14 - 所属 MVP / 版本:#15 / MVP - 阶段:Admin 登录与最小账号管理 ## 要解决什么 Admin 业务网页当前无需登录即可访问。需要实现首次管理员初始化和网页登录,同时保证 Client API 路由完全不经过 Web 登录中间件。 ## 做什么 / 不做什么 - 做:v6 迁移;`users`/`web_sessions` Repository;首次管理员初始化;登录、退出、Session;Web 认证中间件;初始化和登录页面;相关测试。 - 不做:不做采购员管理页面,不做公开注册、API Key、Client 登录、复杂 RBAC、刷新令牌和 HTTPS 部署。 ## 怎么做 - 在 `admin/repository/db.go` 末尾追加 v6,不能修改 v1–v5;同步 schema 自检和迁移测试。 - 使用固定版本、兼容 Go 1.23.0 的 `golang.org/x/crypto/bcrypt` 保存密码哈希,不自行设计密码算法。 - Session Token 使用 32 字节安全随机数;Cookie 保存原文,数据库只保存 SHA-256 哈希;默认 12 小时过期。 - 增加 `repository/user.go`、`service/auth.go`、`handler/web/auth.go` 和 `templates/auth/`。 - `/setup` 只在 `users` 为空时可用;创建过程使用写事务重新检查,两个并发请求最多一个成功。 - Web 公开路由、受保护路由和 `/api/v1/client/*` 分组注册;Web 中间件不得挂到整个 Engine。 - 登录 Cookie 使用 `HttpOnly`、`SameSite=Lax`、`Path=/`;HTTPS 时启用 `Secure`。 - 所有 POST 保留 CSRF;退出后删除当前 Session。 预计修改:`admin/go.mod`、`admin/go.sum`、`admin/repository/db.go`、`admin/repository/user.go`、`admin/service/auth.go`、`admin/handler/web/auth.go`、`admin/handler/web/web.go`、`admin/main.go`、`admin/templates/auth/*` 及对应测试。 ## 验收标准 - [x] 全新库访问业务页面会进入初始化页。 - [x] 不存在固定默认密码,密码明文不进入数据库和日志。 - [x] 首次管理员并发初始化最多一个成功,完成后初始化入口永久关闭。 - [x] 正确密码可登录,错误密码使用统一提示。 - [x] 未登录不能访问业务网页,登录后可以访问。 - [x] 退出或 Session 过期后不能继续访问。 - [x] Cookie 和 Session 哈希满足基线要求。 - [x] `/api/v1/client/*` 不经过 Web 登录中间件。 - [x] 能从所有已发布 schema 状态迁移到 v6。 - [x] Go 1.23.0 下构建、测试和 vet 通过。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go vet ./... go build ./... go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN ``` 还要运行首次初始化并发测试、旧库迁移测试和页面认证测试;不得调用真实 Client 或执行采购。 ## 风险和回退 涉及数据库迁移和网页登录。迁移只追加新表,回退代码时保留表不删;测试必须覆盖 v1–v5 的现实库状态。Web 中间件误挂 API 会中断 Client,必须在本工单和回归工单双重验证。
Author
Owner

状态:进行中。开始实施 v6、首次管理员初始化、网页登录/退出、12 小时 Session 和仅保护 Web 路由的认证中间件。严格不包含 #51 的采购员管理页面;当前用户的 Client 侧未提交文件保持不动。

状态:进行中。开始实施 v6、首次管理员初始化、网页登录/退出、12 小时 Session 和仅保护 Web 路由的认证中间件。严格不包含 #51 的采购员管理页面;当前用户的 Client 侧未提交文件保持不动。
Author
Owner

状态:待验收。

实现已完成并按工单边界提交:

  • 0a7db40 feat: 实现 Admin 首次初始化与网页登录 (#50)
  • 771e2ee docs: 归档任务 #50
  • 归档:docs/task/50-admin-首次管理员初始化与网页登录.md

关键结果:

  • v6 追加 users / web_sessions,未改写 v1–v5;
  • 首次初始化并发最多一个成功,密码使用 bcrypt,数据库不保存明文;
  • Session Token 原文只进 HttpOnly Cookie,数据库仅存 SHA-256,固定 12 小时;
  • Web 业务页要求登录,全部 Web POST 保留 CSRF;Client API 独立且不受 Web 登录/CSRF 影响;
  • 初始化、登录、退出、过期、禁用、Cookie 属性和开放重定向均有测试。

验证(Go 1.23.0):

  • gofmt -l .:无输出
  • go vet ./...:通过
  • go build ./...:通过
  • go test ./... -count=1:通过
  • 1366×768 隔离临时库浏览器流程:通过

未调用真实 Client,也未执行采集或采购。工单保持开启,等待用户验收。

状态:待验收。 实现已完成并按工单边界提交: - `0a7db40` feat: 实现 Admin 首次初始化与网页登录 (#50) - `771e2ee` docs: 归档任务 #50 - 归档:`docs/task/50-admin-首次管理员初始化与网页登录.md` 关键结果: - v6 追加 `users` / `web_sessions`,未改写 v1–v5; - 首次初始化并发最多一个成功,密码使用 bcrypt,数据库不保存明文; - Session Token 原文只进 HttpOnly Cookie,数据库仅存 SHA-256,固定 12 小时; - Web 业务页要求登录,全部 Web POST 保留 CSRF;Client API 独立且不受 Web 登录/CSRF 影响; - 初始化、登录、退出、过期、禁用、Cookie 属性和开放重定向均有测试。 验证(Go 1.23.0): - `gofmt -l .`:无输出 - `go vet ./...`:通过 - `go build ./...`:通过 - `go test ./... -count=1`:通过 - 1366×768 隔离临时库浏览器流程:通过 未调用真实 Client,也未执行采集或采购。工单保持开启,等待用户验收。
Author
Owner

用户已于 2026-08-09 明确通过全部 Admin 待验收工单。本工单验收通过,现关闭,并同步父级 #15、#14 的任务清单。

用户已于 2026-08-09 明确通过全部 Admin 待验收工单。本工单验收通过,现关闭,并同步父级 #15、#14 的任务清单。
ila closed this issue 2026-08-09 21:15:46 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#50