feat: 管理员创建终端用户与重置密码 #73

Closed
opened 2026-08-28 21:11:27 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:单元任务
  • 所属 MVP:#35
  • 所属 Epic:#3
  • 状态:已完成
  • 提出时间:2026-08-28
  • 原始需求来源:用户对话
  • 用户确认摘要:增加“管理员创建终端用户”,按已确认方案建立工单并实施。

目标

在继续禁止 Portal 公开注册的前提下,让已登录且通过 Casbin 授权的管理员可以在“用户与访问 → 终端用户”中创建受控 Portal 用户,并可为既有终端用户重置密码,替代日常通过 seed 或直接操作数据库建号。

非目标

  • 不增加 Portal 注册、找回密码、邮件验证或匿名入口。
  • 不合并 sys_user 与 users,不复用管理员凭据。
  • 不增加点数、余额、计费、每日配额或用户自助修改资料。
  • 不展示、返回、记录或审计明文密码。
  • 不修改数据库结构,不使用 AutoMigrate。

已确认方案

Admin API

  • 新增 POST /api/v1/chorus/users,请求包含 username、display_name、email、password、status。
  • 新增 PUT /api/v1/chorus/users/:id/password,仅接收新密码。
  • 两个接口继续位于现有 Admin JWT + Casbin 边界。
  • 账号规范化后唯一,沿用 3–64 位账号规则;邮箱规范化后唯一;密码沿用终端用户 6–1024 字符规则并使用现有 bcrypt:v1 编码。
  • 创建和密码重置写入 admin_audit_events;审计详情、响应、日志和错误不得包含密码或密码哈希。
  • 创建冲突、字段错误和用户不存在返回可定位但不泄露敏感信息的错误。

Admin UI

  • 在现有“终端用户”页标题区增加“新增终端用户”按钮。
  • 复用 Provider/模型页面现有 Element Plus 对话框、表单校验、保存 loading 和错误提示模式。
  • 新增表单字段:账号、昵称、邮箱、初始密码、状态;成功后关闭对话框并刷新列表。
  • 每行增加“重置密码”操作,使用独立确认对话框输入新密码;不显示旧密码。
  • 列表“注册时间”改为“创建时间”。

设计证据

  • 类型:现有界面小范围交互扩展,明确复用既有页面规范,不建立完整新页面原型。
  • 基线:admin-ui/src/views/chorus/users/index.vue 当前终端用户列表;新增/编辑交互复用 admin-ui/src/views/chorus/providers/index.vue 和 models/index.vue 的对话框模式。
  • 版本:v1,2026-08-28。
  • 状态:用户于 2026-08-28 通过“按照你的方案建工单,做”确认。
  • 覆盖范围:新增用户按钮与表单、保存/校验/冲突状态、重置密码操作、列表刷新与创建时间文案。

影响范围

  • admin/app/chorus:DTO、服务、路由、审计和测试。
  • admin-ui/src/api/chorus、admin-ui/src/views/chorus/users:接口封装与页面交互。
  • Casbin/API 基线:若当前通配策略不能覆盖新接口,则通过可逆 migration 增补;先以现有权限事实为准。
  • 长期文档:Architecture-and-Code-Map、Business-Rules-and-Glossary、Local-Development-and-Verification、Product-Requirements-Overview。

风险与控制

  • 风险:弱密码、重复账号/邮箱、越权创建、密码进入日志或审计。
  • 控制:复用统一密码编码与校验;数据库唯一约束前置检查并保留冲突兜底;JWT/Casbin 双重保护;审计只记录用户编号、账号和状态等非秘密摘要。
  • 回退:移除新增路由和 UI 入口;如需 migration,执行对应 down。已创建用户属于业务数据,代码回退不得自动删除。

验收标准

  • 有权限管理员可创建 active 或 disabled 终端用户,创建后列表立即可见。
  • 新用户可用账号和初始密码登录 Portal;disabled 用户不能登录。
  • 管理员可重置终端用户密码;旧密码失效,新密码可登录。
  • 重复账号、重复邮箱、非法账号、缺失字段及 6 字符以下密码被拒绝。
  • 未认证或无权限请求不能创建用户或重置密码。
  • API 响应、错误、日志与审计均不包含明文密码或密码哈希。
  • Portal 仍无注册路由和注册链接。
  • Admin Go 测试、Portal 受影响测试、Admin UI 单测/构建及必要浏览器验证通过。
  • 长期 Wiki 更新、回读、镜像同步与工单证据完成。

前置依赖

  • #67、#68、#69 已验收完成;现有 Admin JWT/Casbin 和终端用户页面可复用。
  • 与 #54 无运行依赖,可独立实施。
## 基本信息 - 类型:单元任务 - 所属 MVP:#35 - 所属 Epic:#3 - 状态:已完成 - 提出时间:2026-08-28 - 原始需求来源:用户对话 - 用户确认摘要:增加“管理员创建终端用户”,按已确认方案建立工单并实施。 ## 目标 在继续禁止 Portal 公开注册的前提下,让已登录且通过 Casbin 授权的管理员可以在“用户与访问 → 终端用户”中创建受控 Portal 用户,并可为既有终端用户重置密码,替代日常通过 seed 或直接操作数据库建号。 ## 非目标 - 不增加 Portal 注册、找回密码、邮件验证或匿名入口。 - 不合并 `sys_user` 与 `users`,不复用管理员凭据。 - 不增加点数、余额、计费、每日配额或用户自助修改资料。 - 不展示、返回、记录或审计明文密码。 - 不修改数据库结构,不使用 AutoMigrate。 ## 已确认方案 ### Admin API - 新增 `POST /api/v1/chorus/users`,请求包含 `username`、`display_name`、`email`、`password`、`status`。 - 新增 `PUT /api/v1/chorus/users/:id/password`,仅接收新密码。 - 两个接口继续位于现有 Admin JWT + Casbin 边界。 - 账号规范化后唯一,沿用 3–64 位账号规则;邮箱规范化后唯一;密码沿用终端用户 6–1024 字符规则并使用现有 `bcrypt:v1` 编码。 - 创建和密码重置写入 `admin_audit_events`;审计详情、响应、日志和错误不得包含密码或密码哈希。 - 创建冲突、字段错误和用户不存在返回可定位但不泄露敏感信息的错误。 ### Admin UI - 在现有“终端用户”页标题区增加“新增终端用户”按钮。 - 复用 Provider/模型页面现有 Element Plus 对话框、表单校验、保存 loading 和错误提示模式。 - 新增表单字段:账号、昵称、邮箱、初始密码、状态;成功后关闭对话框并刷新列表。 - 每行增加“重置密码”操作,使用独立确认对话框输入新密码;不显示旧密码。 - 列表“注册时间”改为“创建时间”。 ## 设计证据 - 类型:现有界面小范围交互扩展,明确复用既有页面规范,不建立完整新页面原型。 - 基线:`admin-ui/src/views/chorus/users/index.vue` 当前终端用户列表;新增/编辑交互复用 `admin-ui/src/views/chorus/providers/index.vue` 和 `models/index.vue` 的对话框模式。 - 版本:v1,2026-08-28。 - 状态:用户于 2026-08-28 通过“按照你的方案建工单,做”确认。 - 覆盖范围:新增用户按钮与表单、保存/校验/冲突状态、重置密码操作、列表刷新与创建时间文案。 ## 影响范围 - `admin/app/chorus`:DTO、服务、路由、审计和测试。 - `admin-ui/src/api/chorus`、`admin-ui/src/views/chorus/users`:接口封装与页面交互。 - Casbin/API 基线:若当前通配策略不能覆盖新接口,则通过可逆 migration 增补;先以现有权限事实为准。 - 长期文档:Architecture-and-Code-Map、Business-Rules-and-Glossary、Local-Development-and-Verification、Product-Requirements-Overview。 ## 风险与控制 - 风险:弱密码、重复账号/邮箱、越权创建、密码进入日志或审计。 - 控制:复用统一密码编码与校验;数据库唯一约束前置检查并保留冲突兜底;JWT/Casbin 双重保护;审计只记录用户编号、账号和状态等非秘密摘要。 - 回退:移除新增路由和 UI 入口;如需 migration,执行对应 down。已创建用户属于业务数据,代码回退不得自动删除。 ## 验收标准 - [x] 有权限管理员可创建 active 或 disabled 终端用户,创建后列表立即可见。 - [x] 新用户可用账号和初始密码登录 Portal;disabled 用户不能登录。 - [x] 管理员可重置终端用户密码;旧密码失效,新密码可登录。 - [x] 重复账号、重复邮箱、非法账号、缺失字段及 6 字符以下密码被拒绝。 - [x] 未认证或无权限请求不能创建用户或重置密码。 - [x] API 响应、错误、日志与审计均不包含明文密码或密码哈希。 - [x] Portal 仍无注册路由和注册链接。 - [x] Admin Go 测试、Portal 受影响测试、Admin UI 单测/构建及必要浏览器验证通过。 - [x] 长期 Wiki 更新、回读、镜像同步与工单证据完成。 ## 前置依赖 - #67、#68、#69 已验收完成;现有 Admin JWT/Casbin 和终端用户页面可复用。 - 与 #54 无运行依赖,可独立实施。
Author
Owner

实施完成,待人工验收

最终差异

  • Admin API 新增 POST /api/v1/chorus/users 和 PUT /api/v1/chorus/users/:id/password,继续受 Admin JWT 与 Casbin 保护。
  • 创建用户支持账号、昵称、邮箱、初始密码和 active/disabled 状态;账号和邮箱规范化并处理并发唯一冲突。
  • 初始密码和重置密码均使用现有 bcrypt:v1 编码;用户读取显式排除 password_hash。
  • 创建和重置写入管理员审计,但响应、错误及审计摘要不包含明文密码或密码哈希。
  • Admin“终端用户”页增加“新增终端用户”和行级“重置密码”,表单关闭后清空密码;“注册时间”改为“创建时间”。
  • migration 11 仅补充新接口的 sys_api、菜单接口规则与 chorus_operator Casbin 权限;不改用户表结构和业务数据。
  • Portal 公开注册仍保持禁用,管理员表与终端用户表继续分离。

验证结果

  • go test ./...:通过。
  • go vet ./...:通过。
  • go -C admin test ./...:通过。
  • go -C admin vet ./...:通过。
  • Admin MySQL 集成测试:通过;覆盖创建、重复冲突、密码验证、重置后旧密码失效/新密码有效、审计脱敏和未授权拒绝。
  • Admin UI:完整 lint 0 error(保留既有 warning);17 个 Jest suite、69 个测试通过;生产构建通过(仅既有依赖/包体积 warning)。
  • migration 1→11、11 down、11 up:在一次性 MySQL 测试库验证通过。
  • python -m unittest discover -s tests -v:45 项通过。
  • python dev_scripts/harness.py check --strict、sync --check、git diff --check:通过。
  • 本机开发库已执行 migration 10→11;Supervisor 三个服务已重建并重启,Portal 与 Admin UI HTTP 检查均为 200。
  • 未执行会写入真实终端用户数据的手工页面提交;创建和重置行为由自动化集成测试覆盖,待用户在管理端完成最终界面验收。

文档

已更新并在线回读以下 Wiki,随后同步核心镜像:

  • Architecture-and-Code-Map:0ae0f617f353daa24a43ea3c48cd188599b6f5b9
  • Business-Rules-and-Glossary:3c04a5144ee4280aa9f521870713361938b35d72
  • Local-Development-and-Verification:7e5263ea3ca25119464e10b1afcda12e9582229c
  • Product-Requirements-Overview:5a9e186e2c9af9b68f3934f2c19889f07326cbfe

提交

  • e6b1345 feat: 支持管理员创建终端用户 (#73)
  • 已推送至 origin/main

文档影响:有长期影响,Wiki 与 docs/ 核心镜像均已更新。本工单保持开启,状态为“待验收”。

## 实施完成,待人工验收 ### 最终差异 - Admin API 新增 `POST /api/v1/chorus/users` 和 `PUT /api/v1/chorus/users/:id/password`,继续受 Admin JWT 与 Casbin 保护。 - 创建用户支持账号、昵称、邮箱、初始密码和 active/disabled 状态;账号和邮箱规范化并处理并发唯一冲突。 - 初始密码和重置密码均使用现有 `bcrypt:v1` 编码;用户读取显式排除 `password_hash`。 - 创建和重置写入管理员审计,但响应、错误及审计摘要不包含明文密码或密码哈希。 - Admin“终端用户”页增加“新增终端用户”和行级“重置密码”,表单关闭后清空密码;“注册时间”改为“创建时间”。 - migration 11 仅补充新接口的 `sys_api`、菜单接口规则与 chorus_operator Casbin 权限;不改用户表结构和业务数据。 - Portal 公开注册仍保持禁用,管理员表与终端用户表继续分离。 ### 验证结果 - `go test ./...`:通过。 - `go vet ./...`:通过。 - `go -C admin test ./...`:通过。 - `go -C admin vet ./...`:通过。 - Admin MySQL 集成测试:通过;覆盖创建、重复冲突、密码验证、重置后旧密码失效/新密码有效、审计脱敏和未授权拒绝。 - Admin UI:完整 lint 0 error(保留既有 warning);17 个 Jest suite、69 个测试通过;生产构建通过(仅既有依赖/包体积 warning)。 - migration 1→11、11 down、11 up:在一次性 MySQL 测试库验证通过。 - `python -m unittest discover -s tests -v`:45 项通过。 - `python dev_scripts/harness.py check --strict`、`sync --check`、`git diff --check`:通过。 - 本机开发库已执行 migration 10→11;Supervisor 三个服务已重建并重启,Portal 与 Admin UI HTTP 检查均为 200。 - 未执行会写入真实终端用户数据的手工页面提交;创建和重置行为由自动化集成测试覆盖,待用户在管理端完成最终界面验收。 ### 文档 已更新并在线回读以下 Wiki,随后同步核心镜像: - Architecture-and-Code-Map:`0ae0f617f353daa24a43ea3c48cd188599b6f5b9` - Business-Rules-and-Glossary:`3c04a5144ee4280aa9f521870713361938b35d72` - Local-Development-and-Verification:`7e5263ea3ca25119464e10b1afcda12e9582229c` - Product-Requirements-Overview:`5a9e186e2c9af9b68f3934f2c19889f07326cbfe` ### 提交 - `e6b1345 feat: 支持管理员创建终端用户 (#73)` - 已推送至 `origin/main` 文档影响:有长期影响,Wiki 与 `docs/` 核心镜像均已更新。本工单保持开启,状态为“待验收”。
ila referenced this issue from a commit 2026-08-28 21:59:54 +08:00
Author
Owner

2026-08-28:用户明确确认“#73 通过验收”。验收标准已全部确认通过;长期 Wiki 已更新并在线回读,Product-Requirements-Overview revision 为 608429d31ef6171456fc8dc83a3a0bfe6c5adb45,核心镜像经 sync --check 验证一致并由提交 588f09b 推送。工单状态更新为“已完成”,现关闭。

2026-08-28:用户明确确认“#73 通过验收”。验收标准已全部确认通过;长期 Wiki 已更新并在线回读,Product-Requirements-Overview revision 为 `608429d31ef6171456fc8dc83a3a0bfe6c5adb45`,核心镜像经 `sync --check` 验证一致并由提交 `588f09b` 推送。工单状态更新为“已完成”,现关闭。
ila closed this issue 2026-08-28 22:00:17 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#73