## 背景 Windup 后端此前没有用户体系,所有 API 无鉴权,任何人可操作任何数据。本次在 `feat/backend-dev` 分支实现了完整的用户认证模块,并修复了由此暴露的一系列权限与基础设施问题。 ## 实现内容 ### 1. 用户注册与登录 - 邮箱 + 验证码 + 密码注册(`POST /auth/register`) - 邮箱 + 密码 + 验证码登录(`POST /auth/login`) - 邮箱 + 验证码免密登录,无账号自动注册(`POST /auth/login-by-code`) - 刷新 token(`POST /auth/refresh`) - 登出(`POST /auth/logout`) ### 2. JWT 鉴权中间件 - `AuthMiddleware`(`BaseHTTPMiddleware`)统一拦截请求 - 白名单路径放行(`/auth/*`、`/docs`、`/health` 等) - 验证通过后注入 `request.state.current_user`(`id`、`email`) - access_token 有效期 15 分钟,refresh_token 7 天 ### 3. 邮箱验证码 - Redis 存储验证码(5 分钟 TTL)+ 发送冷却(60 秒) - `email_provider` 抽象层,可对接任意 SMTP 服务 ### 4. 接口限流中间件 - `RateLimitMiddleware` 基于 Redis 滑动窗口 - 全局 60 次/分钟/IP,敏感接口 10 次/分钟/IP,用户级 120 次/分钟 - Redis 不可用时优雅降级(跳过限流,不阻断请求) ## 安全修复(本次同步完成) | 问题 | 修复 | |---|---| | middleware 层 `BizException` 跳过 `ExceptionMiddleware`,返回 500 而非业务码 | 改为直接返回 `JSONResponse` | | project API 信任客户端传入的 `user_id`,可越权操作 | 从 JWT 取 `user_id`,加归属校验 | | generation API 同上 + `project_id` 无归属校验 | 同上 + 校验 project 归属 | | `create_character` 漏传 `name` 参数,名称丢失 | 补传 `name=body.name` | | docker-compose 缺 Redis 服务,认证功能不可用 | 添加 `redis:7-alpine` 服务 + `REDIS_URL` | | `init.sql` 缺 `windup_project` 唯一约束,生产可插入重名 | 补充 `UNIQUE (user_id, project_name)` | ## 数据模型 ``` windup_user ├── id BIGINT PK ├── email VARCHAR(255) UNIQUE ├── password_hash VARCHAR(255) ├── nickname VARCHAR(255) ├── email_verified_at TIMESTAMPTZ ├── status SMALLINT (0=正常, 1=封禁) ├── last_login_at TIMESTAMPTZ ├── create_at TIMESTAMPTZ └── update_at TIMESTAMPTZ ``` ## 测试覆盖 - `test_user_service.py`:22 个用例,覆盖注册/登录/验证码/登出/刷新/改密/限流 - `test_project_api.py`:9 个用例,覆盖 CRUD + 权限归属 - `test_character_api.py`:3 个用例,覆盖命名持久化 ## 关联 - 主 PR:#75 `feat: backend dev` - 用户模块 PR:#144 `feat(auth): split auth session module`
Activity
xiaocheny214 commentedon Aug 6, 2026
已包含在 PR #75 中,随 分支一起提交。