diff --git a/docs/task/97-Sense免验证码登录与管理员密码重置.md b/docs/task/97-Sense免验证码登录与管理员密码重置.md new file mode 100644 index 0000000..2bc1326 --- /dev/null +++ b/docs/task/97-Sense免验证码登录与管理员密码重置.md @@ -0,0 +1,79 @@ + +generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) +wiki_page: Task-97-Sense免验证码登录与管理员密码重置 +wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Task-97-Sense%E5%85%8D%E9%AA%8C%E8%AF%81%E7%A0%81%E7%99%BB%E5%BD%95%E4%B8%8E%E7%AE%A1%E7%90%86%E5%91%98%E5%AF%86%E7%A0%81%E9%87%8D%E7%BD%AE.- +wiki_revision: a5c7ff4bb01b8d2e72ef1d94bec8b71b766b4d4d +synchronized_at: 2026-08-15T10:08:07Z + + +# 97 Sense免验证码登录与管理员密码重置 + +- 类型:安全行为调整 / 缺陷修复 +- 所属 Epic:#7 +- 所属 MVP / 版本:#8 +- 状态:待验收 +- 日期:2026-08-15 +- Gitea 工单:https://git.ilapage.cn/ila/yovision/issues/97 +- Wiki 页面:Task-97-Sense免验证码登录与管理员密码重置 +- Wiki revision:见本地镜像头 + +## 背景与目标 + +GoAdmin 重建后的 Sense 登录页和生产后端重新启用了验证码,与用户确认的账号密码直接登录流程不一致。用户要求所有运行模式恢复免验证码登录,并把当前本地 PostgreSQL 的管理员账号设置为用户指定、满足现行 6–72 字节策略的密码;密码明文不得进入仓库、工单、Wiki 或日志。 + +## 最终方案 + +- 保留冻结 GoAdmin 的 Gin/GORM/JWT/Casbin `Authenticator`、登录路由、Vuex 登录动作、Element Plus 表单和同步身份审计。 +- 登录 DTO 只保留 `username/password`;production、test、dev 均不再校验验证码。 +- 登录页移除验证码字段、规则、图标、接口请求、失败刷新和样式;兼容保留 `/api/v1/captcha` 端点及上游存储初始化,便于回退。 +- Swagger 登录载荷同步为只要求账号和密码。 +- 修复失败认证分支未把用户名写入审计的问题,使错误密码尝试可按账号追踪。 +- 目标数据库起初没有任何用户,因此没有执行不安全的直接插入;使用一次性高熵进程令牌走既有 `/api/v1/bootstrap` 安全初始化路径创建 `admin`,密码只在进程内传递。随后验证正确密码成功、错误密码拒绝和成功/失败审计。 +- 密码最少 6 位、最多 72 字节且不强制字符复杂度的既有策略保持不变;JWT、RBAC、Cookie 和会话有效期未修改。 + +## 修改文件 + +- `Sense/server/common/middleware/handler/auth.go`:移除验证码校验并补齐失败登录用户名审计。 +- `Sense/server/common/middleware/handler/login.go`:登录载荷只保留账号和密码。 +- `Sense/server/common/middleware/handler/login_test.go`:覆盖无验证码登录载荷。 +- `Sense/server/docs/admin/admin_docs.go`、`admin_swagger.json`、`admin_swagger.yaml`:同步登录接口模型。 +- `Sense/ui/src/views/login/index.vue`:移除验证码 UI、请求和状态。 +- `Sense/ui/tests/unit/login/loginPage.spec.js`:覆盖登录页只使用账号密码。 +- Wiki `Product-Requirements`、`Local-Development-and-Verification` 及镜像:记录免验证码登录、安全审计和密码策略边界。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 登录页不显示验证码且不请求验证码接口 | 通过:组件状态、规则与方法均只含账号密码;生产构建通过 | +| 所有模式接受仅账号密码的登录载荷 | 通过:后端不再按模式进入 captcha 校验,DTO 定向测试通过 | +| 正确密码成功、错误密码拒绝并有脱敏审计 | 通过:本地 production/PostgreSQL smoke 成功;成功与失败审计均可按 admin 查询 | +| JWT、RBAC、未登录拒绝不变 | 通过:未认证管理路由返回 401,全量后端测试通过 | +| 密码策略仍为 6–72 字节 | 通过:现有密码策略测试通过,相关代码未修改 | +| 管理员密码安全设置且仓库无明文 | 通过:空用户库经一次性 bootstrap 创建,跟踪差异秘密扫描无泄漏 | +| 前后端测试和 production build | 通过 | + +## 测试 + +- `go test ./...`:通过。 +- `go vet ./...`:通过。 +- `go build ./...`:通过。 +- `corepack pnpm@9.15.1 exec eslint src/views/login/index.vue tests/unit/login/loginPage.spec.js`:通过。 +- 前端全量单测:17 个 suite、46 个 test 通过。 +- `corepack pnpm@9.15.1 run build:prod`:通过;存在既有 Sass、SCSS export、代码生成器和体积 warning,未由本工单引入。 +- production/PostgreSQL/MediaMTX smoke:安全初始化成功、免验证码登录成功、错误密码拒绝、未认证接口返回 401;身份审计包含首个管理员创建、登录成功和登录失败记录。 +- `python -m unittest discover -s tests -v`:31 项通过。 +- `python dev_scripts/check_harness.py --strict`:只因既有 #66/#67 归档缺少当前模板章节失败 4 项,与本工单修改无关。 +- `git diff --check` 与跟踪差异密码扫描:通过。 +- 测试结束后 Sense、MediaMTX 均已停止,18080/9997 无监听;`Sense/ui/node_modules` 与 `Sense/ui/dist` 已清理。 +- **未验证部分**:尚未在 #70 最终 Windows ZIP、客户全新 Windows 主机和客户目标浏览器中重新打包验收;#70 与 #97 合入 `dev` 后需重新生成发布包。 + +## 遗留问题 + +- 验证码 API 为上游兼容而保留但登录链不使用;若未来永久删除,需单独清理工单核对依赖和回退。 +- 取消验证码降低自动化暴力尝试阻力;本工单按用户确认保留失败登录审计,但未引入未确认的限流或锁定体系。 + +## 相关提交 + +- `0bbdb27f6db4f9d08445ca02abae9061c81598b8` 恢复免验证码登录并补充测试。 +- `bc1a01848d1769250b706f207d542b63fee2afa6` 更新 Sense 登录安全边界镜像。 diff --git a/wiki-docs.json b/wiki-docs.json index cf70f4f..eeae211 100644 --- a/wiki-docs.json +++ b/wiki-docs.json @@ -131,6 +131,10 @@ { "page": "Task-69-Sense多边形区域与方向警戒线配置", "path": "docs/task/69-Sense多边形区域与方向警戒线配置.md" + }, + { + "page": "Task-97-Sense免验证码登录与管理员密码重置", + "path": "docs/task/97-Sense免验证码登录与管理员密码重置.md" } ] }