You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

18 KiB

认证核心功能

**本文引用的文件** - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java) - [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java) - [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java) - [UserInfoDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java) - [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java) - [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java) - [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java) - [AuthIdentityMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthIdentityMapper.java) - [AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java) - [application.yml](file://crm-auth/src/main/resources/application.yml)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件围绕认证核心能力进行系统化说明,覆盖用户登录认证流程、JWT令牌生成与验证机制、会话管理实现。重点解析以下模块:

  • AuthController中的登录接口
  • AuthService中的认证逻辑(含密码校验、第三方登录扩展)
  • JwtAuthenticationFilter中的过滤器链处理(请求鉴权、上下文注入)
  • TokenService中的令牌管理服务(签发、刷新、过期策略) 同时涵盖密码加密存储、令牌刷新机制、登录状态管理等关键实现细节与使用示例。

项目结构

认证相关代码集中在 crm-auth 模块中,采用分层架构:

  • 控制器层:对外暴露登录等接口
  • 服务层:封装认证业务逻辑
  • 安全层:过滤器、令牌服务、权限拦截器
  • 领域模型:用户、身份、角色、菜单等实体及DTO/Param
  • 数据访问层:MyBatis-Plus Mapper
  • 配置层:安全配置、属性配置、应用启动类
graph TB
subgraph "crm-auth"
C["AuthController"] --> S["IAuthService / AuthServiceImpl"]
S --> M1["AuthUserMapper"]
S --> M2["AuthIdentityMapper"]
F["JwtAuthenticationFilter"] --> T["TokenService"]
F --> SC["SecurityConfig"]
T --> R["Redis(会话/黑名单)"]
A["AuthApplication"] --> SC
A --> C
end

图表来源

  • AuthController.java
  • AuthServiceImpl.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • SecurityConfig.java
  • AuthApplication.java

章节来源

  • AuthController.java
  • AuthServiceImpl.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • SecurityConfig.java
  • AuthApplication.java

核心组件

  • AuthController:提供登录接口,接收登录参数并返回统一结果
  • IAuthService/AuthServiceImpl:认证主流程,包含账号密码校验、第三方登录扩展、权限信息组装
  • JwtAuthenticationFilter:Spring Security过滤器链中的JWT校验与上下文注入
  • TokenService:JWT签发、解析、刷新、黑名单与过期管理
  • SecurityConfig:安全过滤链、白名单、跨域等配置
  • AuthProperties:JWT密钥、过期时间等认证相关配置
  • 领域模型:LoginParam、LoginResultDTO、UserInfoDTO、AuthUser、AuthIdentity等

章节来源

  • AuthController.java
  • IAuthService.java
  • AuthServiceImpl.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • SecurityConfig.java
  • AuthProperties.java
  • LoginParam.java
  • LoginResultDTO.java
  • UserInfoDTO.java

架构总览

下图展示从HTTP请求到认证决策的完整链路,包括登录、鉴权、令牌签发与刷新。

sequenceDiagram
participant Client as "客户端"
participant Controller as "AuthController"
participant Service as "IAuthService"
participant DB as "AuthUserMapper/AuthIdentityMapper"
participant Token as "TokenService"
participant Filter as "JwtAuthenticationFilter"
participant Sec as "SecurityConfig"
Client->>Controller : "POST /auth/login"
Controller->>Service : "login(LoginParam)"
Service->>DB : "查询用户/身份"
DB-->>Service : "用户实体/身份信息"
Service->>Service : "密码校验/第三方校验"
Service->>Token : "签发JWT(含用户信息)"
Token-->>Service : "JWT字符串"
Service-->>Controller : "LoginResultDTO"
Controller-->>Client : "响应{token, userInfo}"
Note over Client,Sec : "后续请求携带Authorization : Bearer {token}"
Client->>Filter : "带Token的请求"
Filter->>Token : "解析并校验JWT"
Token-->>Filter : "Claims/是否有效"
Filter->>Sec : "设置SecurityContext"
Sec-->>Client : "放行或拒绝"

图表来源

  • AuthController.java
  • IAuthService.java
  • AuthServiceImpl.java
  • AuthUserMapper.java
  • AuthIdentityMapper.java
  • TokenService.java
  • JwtAuthenticationFilter.java
  • SecurityConfig.java

详细组件分析

AuthController 登录接口

  • 职责:接收登录请求参数,调用认证服务,返回统一结果
  • 输入:LoginParam(用户名/手机号/邮箱、密码、验证码等)
  • 输出:LoginResultDTO(包含JWT、用户基本信息)
  • 错误处理:参数校验失败、认证失败、系统异常统一包装为Result

章节来源

  • AuthController.java
  • LoginParam.java
  • LoginResultDTO.java

IAuthService/AuthServiceImpl 认证逻辑

  • 职责:实现登录主流程,包括账号密码校验、第三方登录扩展、权限信息组装
  • 关键点:
    • 根据标识类型(手机号/邮箱/用户名)定位用户
    • 密码校验通过BCrypt或同类算法比对
    • 支持第三方登录(如钉钉),通过ThirdPartyAuthClient获取外部用户信息并映射本地用户
    • 组装用户信息与权限集合,供JWT载荷使用
  • 扩展点:新增第三方登录源时,实现对应Client并在工厂中注册
flowchart TD
Start(["开始"]) --> Parse["解析登录参数"]
Parse --> FindUser["根据标识查找用户"]
FindUser --> UserFound{"找到用户?"}
UserFound --> |否| Error1["返回认证失败"]
UserFound --> |是| CheckPwd["校验密码/第三方授权"]
CheckPwd --> Valid{"校验通过?"}
Valid --> |否| Error2["返回认证失败"]
Valid --> |是| BuildInfo["构建用户信息与权限"]
BuildInfo --> IssueToken["调用TokenService签发JWT"]
IssueToken --> Return["返回LoginResultDTO"]
Error1 --> End(["结束"])
Error2 --> End
Return --> End

图表来源

  • IAuthService.java
  • AuthServiceImpl.java
  • AuthUserMapper.java
  • AuthIdentityMapper.java

章节来源

  • IAuthService.java
  • AuthServiceImpl.java
  • AuthUser.java
  • AuthIdentity.java

JwtAuthenticationFilter 过滤器链处理

  • 职责:在Spring Security过滤器链中拦截请求,提取并校验JWT,注入当前登录用户上下文
  • 处理流程:
    • 从请求头提取Authorization
    • 若存在且非空,调用TokenService解析并校验
    • 校验通过后,将用户信息写入SecurityContext
    • 未通过则直接拒绝或继续后续过滤器
  • 白名单:由SecurityConfig配置,跳过鉴权的接口(如登录、健康检查)
sequenceDiagram
participant Client as "客户端"
participant Filter as "JwtAuthenticationFilter"
participant Token as "TokenService"
participant Sec as "SecurityConfig"
Client->>Filter : "HTTP请求(Authorization : Bearer ...)"
Filter->>Filter : "提取Token"
Filter->>Token : "解析并校验"
Token-->>Filter : "有效/无效"
alt "有效"
Filter->>Sec : "设置SecurityContext"
Filter-->>Client : "放行"
else "无效"
Filter-->>Client : "401/403"
end

图表来源

  • JwtAuthenticationFilter.java
  • TokenService.java
  • SecurityConfig.java

章节来源

  • JwtAuthenticationFilter.java
  • SecurityConfig.java

TokenService 令牌管理服务

  • 职责:JWT的签发、解析、刷新、黑名单与过期管理
  • 核心能力:
    • 签发:基于用户ID、角色、权限等信息生成JWT,设置过期时间
    • 解析:校验签名、过期时间、黑名单;返回Claims
    • 刷新:支持无感刷新,结合Redis记录刷新次数与滑动过期
    • 黑名单:登出时将旧令牌的JTI加入黑名单,防止重用
    • 会话:可选地维护在线用户列表与最近活跃时间
  • 配置项:密钥、过期时间、刷新策略等来自AuthProperties
classDiagram
class TokenService {
+issue(user) String
+parse(token) Claims
+refresh(token) String
+blacklist(jti) void
+isBlacklisted(jti) boolean
+setOnline(userId, token) void
+removeOnline(userId) void
}
class AuthProperties {
+secretKey : String
+accessTokenExpire : long
+refreshTokenExpire : long
+blacklistEnabled : boolean
}
TokenService --> AuthProperties : "读取配置"

图表来源

  • TokenService.java
  • AuthProperties.java

章节来源

  • TokenService.java
  • AuthProperties.java

安全配置与启动

  • SecurityConfig:定义过滤链、白名单、跨域、异常处理器等
  • AuthApplication:应用入口,启用必要的注解与组件扫描

章节来源

  • SecurityConfig.java
  • AuthApplication.java

依赖关系分析

  • 控制器依赖服务层,服务层依赖Mapper与第三方客户端
  • 过滤器依赖TokenService与安全配置
  • 配置中心集中管理JWT与认证相关参数
  • Redis用于令牌黑名单与会话管理(由TokenService使用)
graph LR
AC["AuthController"] --> AS["IAuthService"]
AS --> AU["AuthUserMapper"]
AS --> AI["AuthIdentityMapper"]
JF["JwtAuthenticationFilter"] --> TS["TokenService"]
TS --> AP["AuthProperties"]
JF --> SC["SecurityConfig"]

图表来源

  • AuthController.java
  • IAuthService.java
  • AuthUserMapper.java
  • AuthIdentityMapper.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • AuthProperties.java
  • SecurityConfig.java

章节来源

  • AuthController.java
  • IAuthService.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • AuthProperties.java
  • SecurityConfig.java

性能考虑

  • JWT解析开销:避免在高频路径重复解析,可在网关层缓存解析结果或使用短生命周期Access Token
  • Redis访问:令牌黑名单与在线会话需控制读写频率,合理设置过期时间
  • 数据库查询:用户与身份查询应加索引,避免N+1问题
  • 并发安全:令牌刷新与黑名单操作需保证原子性,必要时使用分布式锁
  • 序列化:用户信息DTO尽量精简,减少网络传输体积

[本节为通用指导,不直接分析具体文件]

故障排查指南

  • 登录失败
    • 检查LoginParam参数是否正确
    • 确认用户是否存在、状态是否正常
    • 核对密码加密算法与存储值一致
  • 鉴权失败
    • 检查Authorization头格式是否为Bearer
    • 确认Token未被吊销且在有效期内
    • 查看SecurityConfig白名单是否遗漏
  • 令牌刷新异常
    • 检查Refresh Token是否过期或被拉黑
    • 确认Redis连接正常且键空间未污染
  • 常见问题定位
    • 查看日志中的认证失败原因码
    • 检查AuthProperties配置项是否生效
    • 使用调试工具打印SecurityContext内容

章节来源

  • AuthController.java
  • AuthServiceImpl.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • application.yml

结论

本认证体系以JWT为核心,结合Spring Security过滤器链与Redis会话管理,实现了可扩展、可配置的登录认证与鉴权方案。通过清晰的层次划分与模块化设计,便于后续扩展第三方登录、细粒度权限控制与多端会话管理。建议在生产环境严格管理密钥、合理设置过期策略,并结合监控与审计提升安全性与可观测性。

[本节为总结性内容,不直接分析具体文件]

附录

  • 使用示例(概念性步骤)
    • 登录:POST /auth/login,提交LoginParam,服务端返回LoginResultDTO
    • 访问受保护资源:在请求头添加Authorization: Bearer {token}
    • 刷新令牌:调用刷新接口,传入有效的Refresh Token,获取新的Access Token
    • 登出:调用登出接口,服务端将当前Token加入黑名单并清理会话

[本节为概念性说明,不直接分析具体文件]