Files
training-system/training/context/03-功能模块/01-认证模块.md
2026-05-12 12:24:11 +08:00

111 lines
4.7 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.

# 认证模块auth
> 证据来源:[SRC-FEAT-01] [SRC-API-01] [SRC-CODE-01module/auth/]
---
## 1. 模块定位
- **模块目标**负责用户身份验证企业微信OAuth + 账号密码备选)和 JWT Token 的签发、校验,为所有其他模块提供鉴权基础。
- **解决问题**500人规模的企业内部系统需要统一身份验证入口并将身份与角色绑定为下游数据隔离提供 `userId + role + departmentId` 上下文。
---
## 2. 功能清单
[SRC-API-01四、API 接口设计 / SRC-CODE-01module/auth/]
| 功能名称 | 功能描述 | 输入 | 输出 | 依赖模块 |
|---------|---------|------|------|---------|
| 企业微信 OAuth 登录 | 通过企业微信授权 code 换取用户身份,查找系统用户,签发 JWT | wx_code | JWT Token + 用户信息LoginResponse | system查sys_user |
| 账号密码登录(备选) | 用用户名+密码登录BCrypt 验证密码 | username, password | JWT Token + 用户信息 | system查sys_user |
| 获取当前用户信息 | 解析 Token 返回用户基本信息 | Authorization Header | UserInfoResponse | - |
| 微信小程序登录(预留) | 通过小程序 code 获取用户信息 | WechatLoginRequest | JWT Token | system |
| Token 携带与拦截 | AuthInterceptor 拦截所有受保护请求,提取 Token 注入 UserContext | Authorization: Bearer {token} | UserContextThreadLocal | - |
---
## 3. 核心逻辑
### 3.1 业务规则
- 企业微信登录路径:前端传 code → 后端调 weixin-java-cp SDK 换 `access_token` → 获取 `wx_userid` → 查 `sys_user.wx_userid` 匹配 → 用户不存在则返回错误(不自动注册)[SRC-FEAT-01]
- JWT Payload 包含userId、role、departmentId有效期由配置决定
- 密码存储BCrypt 加密Spring Security 6.x初始管理员密码 `admin123` 已预置 [SRC-SQL-015.4]
### 3.2 校验逻辑
| 校验项 | 规则 | 失败响应 |
|-------|------|---------|
| wx_userid 是否存在于 sys_user | 必须已由管理员录入 | 返回错误:用户未录入,请联系管理员 |
| sys_user.status | 必须为 0启用 | 返回错误:账号已禁用 |
| Token 有效性 | 未过期、签名正确 | 返回 401 |
| 受保护接口 Token 缺失 | 无 Authorization Header | 返回 401 |
### 3.3 状态流转
```mermaid
stateDiagram-v2
[*] --> 未认证
未认证 --> 已认证 : 登录成功JWT签发
已认证 --> 未认证 : Token过期 / 主动登出
已认证 --> 已认证 : Token续期如有配置
```
---
## 4. 数据结构
### 4.1 涉及数据表
**sys_user**(读取,不由本模块创建)[SRC-SQL-01]
| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT | 用户主键 |
| wx_userid | VARCHAR(100) | 企业微信用户ID唯一索引 uk_wx_userid |
| username | VARCHAR(50) | 账号密码登录用账号(唯一索引 uk_username |
| password | VARCHAR(100) | BCrypt加密密码 |
| role | TINYINT | 0-管理员 / 1-讲师 / 2-学员 |
| department_id | BIGINT | 所属部门ID会注入 JWT Payload |
| status | TINYINT | 0-启用 / 1-禁用 |
### 4.2 DTO/VO 定义
[SRC-CODE-01module/auth/dto/]
| 类名 | 方向 | 关键字段 |
|------|------|---------|
| LoginRequest | 入参 | username, password |
| WechatLoginRequest | 入参 | code企业微信授权码 |
| LoginResponse | 出参 | token, userId, realName, role, departmentId |
| UserInfoResponse | 出参 | 同 LoginResponse从 Token 解析) |
---
## 5. 对外接口
[SRC-API-01]
| API 名称 | 方法 | 路径 | 权限 |
|---------|------|------|------|
| 企业微信登录 | POST | /api/auth/wechat/login | 公开 |
| 账号密码登录 | POST | /api/auth/login | 公开 |
| 获取当前用户 | GET | /api/auth/me | 需 Token |
**事件机制**登录成功后UserContextThreadLocal持有用户信息供同请求链路的所有 Service 使用,请求结束后清除。[SRC-CODE-01common/context/UserContextHolder.java]
---
## 6. 异常与边界处理
| 场景 | 处理方式 |
|------|---------|
| 企业微信 API 调用超时/失败 | 返回 503提示"企业微信服务暂时不可用,请稍后重试" |
| 企业微信 code 已使用(重放) | 企业微信 SDK 返回错误,转化为 400 |
| 用户 wx_userid 存在但账号被禁用status=1 | 返回 403提示"账号已禁用,请联系管理员" |
| sys_user 中无对应 wx_userid | 返回 403提示"用户未录入系统,请联系管理员" |
| Token 格式错误非JWT | AuthInterceptor 捕获,返回 401 |
| Token 过期 | AuthInterceptor 捕获,返回 401前端跳转登录页 |
| 并发登录(同一账号多端) | 当前设计无限制,多端独立 Token 有效 |