Files
Cyrene/docs/debug/2026-05-20-round1-regression-verification.md
T
AskaEth 9dd1582987 fix: 创建users表 + 用户认证系统 (REG1) — 第1轮调试修复
新增 user_store.go 实现 users 表自动建表和 CRUD
注册使用 bcrypt 哈希密码存入 users 表
登录从 users 表查询用户并验证密码
启动时自动种子 admin/admin123 用户
调试文档: docs/debug/2026-05-20-round1-regression-verification.md
2026-05-20 13:52:12 +08:00

141 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 持续性调试第1轮: 修复后回归验证
**日期**: 2026-05-20
**时间**: UTC+8 13:35
**Commit**: 4b35736 (fix: 修复19个Bug (P0-P3) — 持续性调试第7轮发现的问题)
**上一轮**: 持续性调试第7轮 (19个Bug已全部修复)
---
## 环境确认
| 项目 | 状态 |
|------|------|
| SSH 隧道 | ✅ 活跃 (PID 23132, 端口转发: 5432, 6379, 4222, 8222, 6333, 6334, 9000, 9001) |
| PostgreSQL | ✅ 可连接 (`localhost:5432 - accepting connections`) |
| 数据库 `cyrene_ai` | ✅ 存在 (14张表) |
| Gateway (8080) | ✅ 新版编译启动 (PID 12619) |
| AI-Core (8081) | ✅ 运行中 (PID 15037, 旧版) |
---
## 编译验证
| 服务 | 结果 | 说明 |
|------|------|------|
| gateway | ✅ EXIT:0 | `go build -o ./cmd/gateway ./cmd/` |
| ai-core | ✅ EXIT:0 | `go build -o ./cmd/ai-core ./cmd/` |
| memory-service | ✅ EXIT:0 | `go build -o ./cmd/memory-service ./cmd/` |
| tool-engine | ✅ EXIT:0 | `go build -o ./cmd/tool-engine ./cmd/` |
| voice-service | ✅ EXIT:0 | `go build -o ./cmd/voice-service ./cmd/` |
| iot-debug-service | ✅ EXIT:0 | `go build -o ./cmd/iot-debug-service ./cmd/` |
| 前端 TypeScript | ✅ EXIT:0 | `npx tsc --noEmit` |
**结论**: 所有 6 个 Go 服务 + 前端编译通过,无回归编译错误。
---
## Bug 修复验证 (代码审查)
| Bug ID | 描述 | 文件 | 状态 |
|--------|------|------|------|
| P0#1 | session ID 使用 crypto/rand | [`session_handler.go`](../../backend/gateway/internal/handler/session_handler.go:4) — `import "crypto/rand"`, line 580 `rand.Read(b)` + fallback | ✅ **已修复** |
| P0#3 | goroutine defer recover (Hub.Run) | [`hub.go`](../../backend/gateway/internal/ws/hub.go:102-103) — `defer func() { if r := recover(); r != nil { ... } }()` | ✅ **已修复** |
| P0#4 | goroutine defer recover (广播循环) | [`hub.go`](../../backend/gateway/internal/ws/hub.go:462-463) — 同上方 | ✅ **已修复** |
| P0#5 | adminAuth 使用 is_admin 标记 | [`auth.go`](../../backend/gateway/internal/middleware/auth.go:45) — `c.Set(IsAdminKey, strings.HasPrefix(userID, "admin_"))` + [`router.go`](../../backend/gateway/internal/router/router.go:237) — `c.Get(middleware.IsAdminKey)` | ✅ **已修复** |
| P1#1 | 普通用户登录需密码验证 | [`auth_handler.go`](../../backend/gateway/internal/handler/auth_handler.go:105) — `verifyUserPassword()` 调用, 使用 bcrypt + `password_hash` 查询 | ✅ **逻辑正确** (见下方 REG1) |
| P1#3 | priority 范围扩展 0-10 | 提醒模块 (`reminder_handler.go`, `reminder_store.go`) 中未找到 priority 字段定义 | ⚠️ **需确认** |
**P1#3 详细说明**: 在 [`reminder_handler.go`](../../backend/gateway/internal/handler/reminder_handler.go) 和 [`reminder_store.go`](../../backend/gateway/internal/store/reminder_store.go) 中均未找到 `priority` 字段。priority 字段仅在 [`memory_handler.go`](../../backend/gateway/internal/handler/memory_handler.go:126) 中存在 (记忆模块)。提醒模块可能使用不同的优先级机制或未实现此修复。
---
## API 端到端测试
| 端点 | 方法 | 状态码 | 请求 | 响应摘要 | 结果 |
|------|------|--------|------|----------|------|
| `/api/v1/health` | GET | 200 | - | `{"service":"cyrene-gateway","status":"ok","ws_connections":0}` | ✅ |
| `/api/v1/auth/register` | POST | 400→201 | 缺 `nickname`/`verify_code` → 补充后成功 | `{"token":"eyJ...","user_id":"user_testuser_..."}` | ✅ |
| `/api/v1/auth/login` (管理员) | POST | 200 | `yeij0942` / `Jiang1143218570` | `{"token":"eyJ...","user_id":"admin_yeij0942"}` | ✅ |
| `/api/v1/auth/login` (普通用户) | POST | 500 | 任意非管理员用户名 | `{"error":"服务器内部错误"}` | ❌ (REG1) |
| `/api/v1/sessions` (无token) | GET | 401 | - | `{"error":"未提供认证令牌"}` | ✅ |
| `/api/v1/sessions` (管理员token) | GET | 200 | Bearer token | `{"sessions":[...]}` 返回历史会话 | ✅ |
| `/api/v1/sessions` (POST 创建) | POST | 200 | `{"title":"回归测试会话"}` | `{"id":"session_74fn67z6hp2v","title":"回归测试会话"}` | ✅ |
| `/api/v1/admin/sessions` (管理员) | GET | 200 | Bearer admin token | `{"sessions":[],"total":0}` | ✅ |
**注册成功字段**: username, password, email, nickname, verify_code (`"000000"` 开发阶段通行码)
**管理员凭据验证**: 从 `.env` 读取 — `ADMIN_USERNAME=yeij0942`, `ADMIN_PASSWORD=Jiang1143218570`,管理员的 `user_id` 格式为 `admin_yeij0942``admin_` 前缀触发 `is_admin=true`)。
---
## 新发现问题
### REG1: `users` 表缺失导致普通用户登录 500
**严重性**: P2
**现象**: 非管理员用户登录时返回 `{"error":"服务器内部错误"}` (HTTP 500)
**根因**: [`auth_handler.go`](../../backend/gateway/internal/handler/auth_handler.go:142) 中 `verifyUserPassword` 查询 `SELECT password_hash FROM users WHERE username = $1`,但数据库中**不存在 `users` 表**。当前数据库只有 14 张业务表 (sessions, messages, memories 等),没有用户表。
**影响**: 普通用户登录不可用(管理员登录不受影响,因为走独立分支)。
**修复方向**:
1. 创建 `users` 表 (`id`, `username`, `password_hash`, `email`, `nickname`, `created_at`)
2. 注册时写入 `users` 表 (当前注册直接返回 token,不写入数据库)
3. 或者:在 `users` 表不存在时,回退到内存/文件存储模式
### REG2: `backend/gateway/go.mod` 未提交修改
**严重性**: P3 (低)
**现象**: `git status` 显示 `M backend/gateway/go.mod`
**变更内容**: `golang.org/x/crypto v0.23.0``// indirect` 移至 `require` 直接依赖 (因为 `auth_handler.go` 直接 import `bcrypt`)
**影响**: 编译成功但 commit 不干净;其他开发者拉取后可能需手动 `go mod tidy`
**修复方向**: 提交 `go.mod` 变更或还原
### REG3: P1#3 priority 范围修复需确认
**严重性**: P3 (低)
**现象**: 提醒模块 (`reminder_handler.go`, `reminder_store.go`) 中未找到 priority 字段相关定义
**根因**: P1#3 的 priority 范围修复可能仅在记忆模块实现,未同步到提醒模块;或者提醒模块不需要此字段
**影响**: 若提醒功能需要 priority 过滤,当前不支持
**修复方向**: 确认需求后决定是否需要在提醒模块添加 priority 字段
---
## 数据库完整性
| 表名 | 用途 | 状态 |
|------|------|------|
| automation_rules | 自动化规则 | ✅ |
| automation_scenes | 自动化场景 | ✅ |
| daily_briefings | 每日简报 | ✅ |
| files | 文件管理 | ✅ |
| knowledge_bases | 知识库 | ✅ |
| knowledge_chunks | 知识块 | ✅ |
| knowledge_documents | 知识文档 | ✅ |
| memories | 记忆 | ✅ |
| memory_entries | 记忆条目 | ✅ |
| messages | 消息 | ✅ |
| reminders | 提醒 | ✅ |
| sessions | 会话 | ✅ |
| thinking_logs | 思考日志 | ✅ |
| tool_call_logs | 工具调用日志 | ✅ |
| **users** | **用户** | **❌ 缺失** |
---
## 总结
19 个 Bug 的核心修复代码已落地:
- **P0#1**: crypto/rand ✅
- **P0#3/#4**: goroutine defer recover ✅
- **P0#5**: adminAuth is_admin 标记 ✅
- **P1#1**: 登录密码验证逻辑正确,但因 `users` 表缺失无法正常工作
**新发现 3 个问题**:
- **REG1** (P2): `users` 表缺失 — 需要在下一轮修复中创建
- **REG2** (P3): `go.mod` 未提交变更
- **REG3** (P3): P1#3 priority 修复覆盖范围需确认
**编译与启动**: 全部通过,无回归。
**API 测试**: 管理员流程完全正常,注册流程正常 (需正确 payload),普通用户登录受 REG1 阻塞。