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

4.7 KiB
Raw Blame History

认证模块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 状态流转

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 有效