feat: Portal 自助注册接口与安全限流 #80

Open
opened 2026-08-29 21:00:36 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:单元任务(生产实现)
  • 所属 MVP:#76
  • 所属 Epic:#75
  • 前置工单:#79
  • 状态:待验收
  • 提出时间:2026-08-29
  • 需求来源:用户确认的 #77 技术设计

目标

交付失败关闭的 Portal 注册路由、账号创建与自动登录,并正确处理 CSRF、可信代理客户端 IP、独立注册限流和并发策略变化。

范围

  • GET /register 与 POST /api/session/register。
  • 账号、昵称、密码和确认密码验证;密码 6–1024 字符。
  • 注册事务内复核策略、唯一冲突统一响应、bcrypt:v1、Session 轮换。
  • 可信代理 CIDR 解析;登录与注册均使用安全客户端 key。
  • 独立 5 次/900 秒注册限流,可由 YAML/环境变量覆盖。
  • 注册安全事件与脱敏错误。
  • Handler、限流、可信代理和 MySQL 集成测试。

非目标

页面样式、邮箱验证、验证码、OAuth、多实例分布式限流、Provider 调用。

验收标准

  • 默认关闭、策略读取失败、CSRF、字段边界和唯一冲突契约正确。
  • 开启时注册成功并自动登录,提交链路不调用上游。
  • 直连、可信代理及伪造 XFF 测试通过。
  • 注册限流独立于登录限流,成功也计数且不清零。
  • 日志与响应不含密码、哈希、数据库错误和个人信息。

文档影响

完成后更新 Architecture-and-Code-Map、Local-Development-and-Verification、Deployment-and-Operations。

## 基本信息 - 类型:单元任务(生产实现) - 所属 MVP:#76 - 所属 Epic:#75 - 前置工单:#79 - 状态:待验收 - 提出时间:2026-08-29 - 需求来源:用户确认的 #77 技术设计 ## 目标 交付失败关闭的 Portal 注册路由、账号创建与自动登录,并正确处理 CSRF、可信代理客户端 IP、独立注册限流和并发策略变化。 ## 范围 - GET /register 与 POST /api/session/register。 - 账号、昵称、密码和确认密码验证;密码 6–1024 字符。 - 注册事务内复核策略、唯一冲突统一响应、bcrypt:v1、Session 轮换。 - 可信代理 CIDR 解析;登录与注册均使用安全客户端 key。 - 独立 5 次/900 秒注册限流,可由 YAML/环境变量覆盖。 - 注册安全事件与脱敏错误。 - Handler、限流、可信代理和 MySQL 集成测试。 ## 非目标 页面样式、邮箱验证、验证码、OAuth、多实例分布式限流、Provider 调用。 ## 验收标准 - [ ] 默认关闭、策略读取失败、CSRF、字段边界和唯一冲突契约正确。 - [ ] 开启时注册成功并自动登录,提交链路不调用上游。 - [ ] 直连、可信代理及伪造 XFF 测试通过。 - [ ] 注册限流独立于登录限流,成功也计数且不清零。 - [ ] 日志与响应不含密码、哈希、数据库错误和个人信息。 ## 文档影响 完成后更新 Architecture-and-Code-Map、Local-Development-and-Verification、Deployment-and-Operations。
Author
Owner

开始实施(2026-08-29)。#79 已完成实现、迁移测试并推送 a079a1d,足以解除代码依赖;#79 仍按流程等待用户最终验收。实现将覆盖注册服务、失败关闭路由、可信代理客户端 IP、独立注册限流和配置契约。

开始实施(2026-08-29)。#79 已完成实现、迁移测试并推送 a079a1d,足以解除代码依赖;#79 仍按流程等待用户最终验收。实现将覆盖注册服务、失败关闭路由、可信代理客户端 IP、独立注册限流和配置契约。
Author
Owner

实现完成,待用户验收。

最终差异:

  • 新增失败关闭的 GET /register 与 POST /api/session/register;密码 6–1024 字节、账号规范化、统一冲突响应、事务内策略锁与自动登录。
  • 登录页仅在策略可读且开启时显示入口;关闭返回 404/403,数据库异常返回 503。
  • 新增可信代理 CIDR 解析,登录与注册仅在直接连接来自可信代理时使用 X-Forwarded-For。
  • 新增独立注册限流(默认 5 次/900 秒),成功也计数、不清零;生产要求 YAML 或环境变量显式配置。
  • 注册审计不保存账号、邮箱、密码、IP、User-Agent 或正文。
  • bcrypt:v1 对超过 72 字节的合规长密码做 SHA-256 固定归一化,短密码和既有哈希兼容。

验证:

  • 相关 Go 单元测试与 portal build:通过。
  • 专用 MySQL chorus_test 注册关闭/开启、无邮箱创建、自动登录、账号冲突、5 次限流与 6 类安全事件集成测试:通过。
  • 直连、可信代理链和伪造 XFF:通过。
  • 未调用 Provider。

提交:d617ae0(已推送 main)

文档影响:配置与运行边界将在 #83 更新核心 Wiki 和镜像。

实现完成,待用户验收。 最终差异: - 新增失败关闭的 GET /register 与 POST /api/session/register;密码 6–1024 字节、账号规范化、统一冲突响应、事务内策略锁与自动登录。 - 登录页仅在策略可读且开启时显示入口;关闭返回 404/403,数据库异常返回 503。 - 新增可信代理 CIDR 解析,登录与注册仅在直接连接来自可信代理时使用 X-Forwarded-For。 - 新增独立注册限流(默认 5 次/900 秒),成功也计数、不清零;生产要求 YAML 或环境变量显式配置。 - 注册审计不保存账号、邮箱、密码、IP、User-Agent 或正文。 - bcrypt:v1 对超过 72 字节的合规长密码做 SHA-256 固定归一化,短密码和既有哈希兼容。 验证: - 相关 Go 单元测试与 portal build:通过。 - 专用 MySQL chorus_test 注册关闭/开启、无邮箱创建、自动登录、账号冲突、5 次限流与 6 类安全事件集成测试:通过。 - 直连、可信代理链和伪造 XFF:通过。 - 未调用 Provider。 提交:d617ae0(已推送 main) 文档影响:配置与运行边界将在 #83 更新核心 Wiki 和镜像。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/chorus#80