requirements.md 10 KB

Requirements Document

Introduction

本文档定义了标注平台的 JWT 权限认证体系需求。该系统将为现有的标注平台添加完整的用户认证和授权功能,包括用户注册、登录、JWT token 管理、以及基于中间件的 API 鉴权机制。

Glossary

  • Authentication_System: 用户身份认证系统,负责验证用户身份
  • JWT_Token: JSON Web Token,用于在客户端和服务器之间安全传输用户身份信息的令牌
  • Access_Token: 访问令牌,用于访问受保护的 API 端点,有效期较短(15分钟)
  • Refresh_Token: 刷新令牌,用于获取新的访问令牌,有效期较长(7天)
  • Auth_Middleware: 认证中间件,在请求到达路由处理器之前验证 JWT token
  • Password_Hash: 密码哈希,使用 bcrypt 算法加密存储的用户密码
  • User: 系统用户,具有唯一的用户名和邮箱
  • Role: 用户角色,定义用户的权限级别(admin, annotator, viewer)
  • Protected_Endpoint: 受保护的 API 端点,需要有效的 JWT token 才能访问
  • Public_Endpoint: 公开的 API 端点,无需认证即可访问(如登录、注册)
  • OAuth_Provider: OAuth 认证提供商,未来用于统一认证(预留字段)
  • OAuth_ID: OAuth 提供商返回的用户唯一标识(预留字段)
  • Auth_Service: 认证服务层,封装所有认证相关的业务逻辑

Requirements

Requirement 1: 用户注册

User Story: 作为新用户,我想要注册一个账号,以便我可以使用标注平台的功能。

Acceptance Criteria

  1. WHEN 用户提供有效的用户名、邮箱和密码 THEN THE Authentication_System SHALL 创建新用户账号并返回成功消息
  2. WHEN 用户提供的用户名已存在 THEN THE Authentication_System SHALL 返回 409 错误并提示用户名已被使用
  3. WHEN 用户提供的邮箱已存在 THEN THE Authentication_System SHALL 返回 409 错误并提示邮箱已被使用
  4. WHEN 用户提供的密码长度小于 8 个字符 THEN THE Authentication_System SHALL 返回 400 错误并提示密码过短
  5. THE Authentication_System SHALL 使用 bcrypt 算法对密码进行哈希加密后存储
  6. WHEN 创建新用户 THEN THE Authentication_System SHALL 自动分配默认角色 "annotator"

Requirement 2: 用户登录

User Story: 作为已注册用户,我想要登录系统,以便我可以访问受保护的功能。

Acceptance Criteria

  1. WHEN 用户提供正确的用户名和密码 THEN THE Authentication_System SHALL 返回 Access_Token 和 Refresh_Token
  2. WHEN 用户提供错误的用户名或密码 THEN THE Authentication_System SHALL 返回 401 错误并提示凭据无效
  3. THE Access_Token SHALL 包含用户 ID、用户名、邮箱和角色信息
  4. THE Access_Token SHALL 设置过期时间为 15 分钟
  5. THE Refresh_Token SHALL 设置过期时间为 7 天
  6. THE Authentication_System SHALL 在响应中同时返回用户基本信息(ID、用户名、邮箱、角色)

Requirement 3: Token 刷新

User Story: 作为已登录用户,我想要在访问令牌过期后刷新它,以便我可以继续使用系统而无需重新登录。

Acceptance Criteria

  1. WHEN 用户提供有效的 Refresh_Token THEN THE Authentication_System SHALL 返回新的 Access_Token 和 Refresh_Token
  2. WHEN 用户提供无效或过期的 Refresh_Token THEN THE Authentication_System SHALL 返回 401 错误并提示需要重新登录
  3. THE Authentication_System SHALL 验证 Refresh_Token 的签名和过期时间
  4. THE Authentication_System SHALL 在刷新时生成新的 Refresh_Token 以实现令牌轮换

Requirement 4: JWT 中间件鉴权

User Story: 作为系统管理员,我想要保护 API 端点,以便只有经过认证的用户才能访问受保护的资源。

Acceptance Criteria

  1. WHEN 请求包含有效的 Authorization header 和 JWT token THEN THE Auth_Middleware SHALL 允许请求继续处理
  2. WHEN 请求缺少 Authorization header THEN THE Auth_Middleware SHALL 返回 401 错误并提示缺少认证令牌
  3. WHEN 请求包含无效的 JWT token THEN THE Auth_Middleware SHALL 返回 401 错误并提示令牌无效
  4. WHEN 请求包含过期的 JWT token THEN THE Auth_Middleware SHALL 返回 401 错误并提示令牌已过期
  5. THE Auth_Middleware SHALL 从 JWT token 中提取用户信息并将其附加到请求上下文
  6. THE Auth_Middleware SHALL 验证 JWT token 的签名使用配置的密钥

Requirement 5: 公开端点豁免

User Story: 作为系统架构师,我想要某些端点无需认证即可访问,以便用户可以注册和登录。

Acceptance Criteria

  1. THE Auth_Middleware SHALL 允许 /api/auth/register 端点无需认证访问
  2. THE Auth_Middleware SHALL 允许 /api/auth/login 端点无需认证访问
  3. THE Auth_Middleware SHALL 允许 /api/auth/refresh 端点无需认证访问
  4. THE Auth_Middleware SHALL 允许根路径 / 和 /health 端点无需认证访问
  5. THE Auth_Middleware SHALL 允许 /docs 和 /openapi.json 端点无需认证访问

Requirement 6: 用户信息查询

User Story: 作为已登录用户,我想要查询我的用户信息,以便我可以查看和验证我的账号详情。

Acceptance Criteria

  1. WHEN 已认证用户请求获取当前用户信息 THEN THE Authentication_System SHALL 返回用户的 ID、用户名、邮箱、角色和创建时间
  2. WHEN 未认证用户请求获取用户信息 THEN THE Auth_Middleware SHALL 返回 401 错误
  3. THE Authentication_System SHALL 从 JWT token 中提取用户 ID 来查询用户信息

Requirement 7: 密码安全

User Story: 作为系统管理员,我想要确保用户密码安全存储,以便保护用户账号不被未授权访问。

Acceptance Criteria

  1. THE Authentication_System SHALL 使用 bcrypt 算法对所有用户密码进行哈希加密
  2. THE Authentication_System SHALL 使用 bcrypt 的默认 salt rounds(12 rounds)
  3. THE Password_Hash SHALL 永远不会以明文形式存储或传输
  4. WHEN 验证密码 THEN THE Authentication_System SHALL 使用 bcrypt.checkpw 进行安全比对

Requirement 8: 数据库用户表

User Story: 作为数据库管理员,我想要一个用户表来存储用户信息,以便系统可以持久化用户数据。

Acceptance Criteria

  1. THE Authentication_System SHALL 创建 users 表包含 id、username、email、password_hash、role 和 created_at 字段
  2. THE users 表 SHALL 在 username 字段上设置唯一约束
  3. THE users 表 SHALL 在 email 字段上设置唯一约束
  4. THE users 表 SHALL 在 username 和 email 字段上创建索引以提高查询性能
  5. THE Authentication_System SHALL 在数据库初始化时自动创建 users 表

Requirement 9: 环境配置

User Story: 作为系统部署人员,我想要通过环境变量配置 JWT 密钥和过期时间,以便在不同环境中使用不同的配置。

Acceptance Criteria

  1. THE Authentication_System SHALL 从环境变量 JWT_SECRET_KEY 读取 JWT 签名密钥
  2. THE Authentication_System SHALL 从环境变量 JWT_ALGORITHM 读取 JWT 算法(默认 HS256)
  3. THE Authentication_System SHALL 从环境变量 ACCESS_TOKEN_EXPIRE_MINUTES 读取访问令牌过期时间(默认 15 分钟)
  4. THE Authentication_System SHALL 从环境变量 REFRESH_TOKEN_EXPIRE_DAYS 读取刷新令牌过期时间(默认 7 天)
  5. WHEN JWT_SECRET_KEY 未设置 THEN THE Authentication_System SHALL 生成随机密钥并在日志中警告

Requirement 10: 错误处理

User Story: 作为 API 用户,我想要收到清晰的错误消息,以便我可以理解认证失败的原因。

Acceptance Criteria

  1. WHEN 认证失败 THEN THE Authentication_System SHALL 返回包含错误类型和详细消息的 JSON 响应
  2. THE Authentication_System SHALL 对不同的错误场景返回适当的 HTTP 状态码(400、401、409、500)
  3. THE Authentication_System SHALL 在日志中记录认证失败事件但不记录敏感信息(如密码)
  4. WHEN 发生服务器内部错误 THEN THE Authentication_System SHALL 返回 500 错误并记录详细错误信息

Requirement 11: 现有 API 集成

User Story: 作为系统架构师,我想要将认证系统集成到现有的 API 端点,以便保护项目、任务和标注相关的操作。

Acceptance Criteria

  1. THE Auth_Middleware SHALL 保护所有 /api/projects 端点
  2. THE Auth_Middleware SHALL 保护所有 /api/tasks 端点
  3. THE Auth_Middleware SHALL 保护所有 /api/annotations 端点
  4. WHEN 创建或修改资源 THEN THE Authentication_System SHALL 使用当前认证用户的 ID 作为 user_id 或 assigned_to
  5. THE Authentication_System SHALL 确保用户只能访问和修改自己有权限的资源

Requirement 12: 用户角色权限

User Story: 作为系统管理员,我想要基于用户角色控制访问权限,以便不同角色的用户有不同的操作权限。

Acceptance Criteria

  1. THE Authentication_System SHALL 支持三种角色:admin、annotator、viewer
  2. WHEN 用户角色为 admin THEN THE Authentication_System SHALL 允许所有操作
  3. WHEN 用户角色为 annotator THEN THE Authentication_System SHALL 允许创建和修改标注,但不能删除项目
  4. WHEN 用户角色为 viewer THEN THE Authentication_System SHALL 只允许读取操作,不能创建、修改或删除
  5. THE Auth_Middleware SHALL 提供角色检查装饰器用于保护特定端点

Requirement 13: OAuth 集成预留

User Story: 作为系统架构师,我想要为未来的 OAuth 认证服务中心集成预留接口,以便系统可以平滑过渡到统一认证。

Acceptance Criteria

  1. THE Authentication_System SHALL 设计可扩展的认证接口,支持未来集成 OAuth 提供商
  2. THE User 模型 SHALL 预留 oauth_provider 和 oauth_id 字段用于存储 OAuth 提供商信息
  3. THE Authentication_System SHALL 将认证逻辑封装在独立的服务层,便于未来替换或扩展
  4. THE JWT_Token 结构 SHALL 保持标准化,确保与 OAuth token 兼容
  5. THE Authentication_System SHALL 在配置中预留 OAuth 相关的环境变量占位符