fix: 创建users表 + 用户认证系统 (REG1) — 第1轮调试修复
新增 user_store.go 实现 users 表自动建表和 CRUD 注册使用 bcrypt 哈希密码存入 users 表 登录从 users 表查询用户并验证密码 启动时自动种子 admin/admin123 用户 调试文档: docs/debug/2026-05-20-round1-regression-verification.md
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
# 持续性调试第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 阻塞。
|
||||
Reference in New Issue
Block a user