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.
42 KiB
42 KiB
认证服务模块(crm-auth)
**本文引用的文件** - [AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java) - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java) - [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java) - [DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java) - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.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) - [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [DataScopeTables.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeTables.java) - [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java) - [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [IAuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [IAuthIdentityService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthIdentityService.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java) - [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java) - [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java) - [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java) - [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java) - [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java) - [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.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) - [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java) - [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.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) - [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java) - [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java) - [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java) - [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java) - [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java) - [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java) - [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java) - [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java) - [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.java) - [AuthConstants.java](file://crm-auth/src/main/java/com/crm/auth/constant/AuthConstants.java) - [application.yml](file://crm-auth/src/main/resources/application.yml)更新摘要
变更内容
- 新增用户列表分页查询功能,包含 UserPageParam、UserListDTO、UserStatsVO 等核心类
- 增强用户管理功能的分页查询和统计能力
- 完善用户信息查询接口,支持多维度筛选和分页展示
目录
简介
本模块为 CRM 后端的认证与授权中心,提供用户登录、JWT 令牌签发与校验、角色权限控制、数据权限(部门/范围)过滤、第三方登录集成(如钉钉)等能力。通过安全配置、过滤器链与拦截器协同工作,实现从请求入口到业务方法的全链路鉴权与数据可见性控制。最新更新增强了用户列表管理功能,支持分页查询和多维度统计。
项目结构
认证模块采用分层架构:
- 配置层:安全策略、权限开关、第三方登录参数、初始化数据等
- 控制器层:登录、登出、用户信息、系统信息等接口
- 安全层:JWT 过滤器、令牌服务、登录用户上下文、异常处理、数据权限拦截器
- 服务层:认证、用户、身份、角色、菜单、部门等业务逻辑
- 领域模型:实体、枚举、DTO、入参
- 客户端:第三方登录客户端及工厂
graph TB
subgraph "配置"
SC["SecurityConfig"]
PC["PermissionConfig"]
AP["AuthProperties"]
DI["DataInitializer"]
end
subgraph "控制器"
AC["AuthController"]
SYSC["SystemController"]
end
subgraph "安全"
JF["JwtAuthenticationFilter"]
TS["TokenService"]
ALU["AuthLoginUser"]
DSI["DataScopeInterceptor"]
SEH["SecurityExceptionHandlers"]
end
subgraph "服务"
IAS["IAuthService"]
AS["AuthServiceImpl"]
IAUS["IAuthUserService"]
AUS["AuthUserServiceImpl"]
IIDS["IAuthIdentityService"]
AIS["AuthIdentityServiceImpl"]
IRS["ISysRoleService"]
SRS["SysRoleServiceImpl"]
IMS["ISysMenuService"]
SMS["SysMenuServiceImpl"]
IDS["ISysDeptService"]
SDS["SysDeptServiceImpl"]
end
subgraph "第三方"
DTAC["DingTalkAuthClient"]
TPAC["ThirdPartyAuthClient"]
TPACF["ThirdPartyAuthClientFactory"]
TPI["ThirdPartyUserInfo"]
end
subgraph "领域模型"
LPM["LoginParam"]
UPM["UserPageParam"]
LRDTO["LoginResultDTO"]
UIDTO["UserInfoDTO"]
ULDTO["UserListDTO"]
USVO["UserStatsVO"]
AU["AuthUser"]
AI["AuthIdentity"]
SR["SysRole"]
SM["SysMenu"]
SD["SysDept"]
SUR["SysUserRole"]
SRM["SysRoleMenu"]
SUD["SysUserDept"]
end
AC --> IAS
AC --> IAUS
AC --> IIDS
SYSC --> IMS
SYSC --> IRS
SYSC --> IDS
JF --> TS
JF --> ALU
DSI --> ALU
AS --> IAUS
AS --> IIDS
AS --> IRS
AS --> IMS
AS --> IDS
AUS --> IIDS
AIS --> IAUS
SRS --> IRS
SMS --> IMS
SDS --> IDS
DTAC --> TPAC
TPACF --> DTAC
图表来源
- SecurityConfig.java
- PermissionConfig.java
- AuthProperties.java
- DataInitializer.java
- AuthController.java
- SystemController.java
- JwtAuthenticationFilter.java
- TokenService.java
- AuthLoginUser.java
- DataScopeInterceptor.java
- SecurityExceptionHandlers.java
- IAuthService.java
- AuthServiceImpl.java
- IAuthUserService.java
- AuthUserServiceImpl.java
- IAuthIdentityService.java
- AuthIdentityServiceImpl.java
- ISysRoleService.java
- SysRoleServiceImpl.java
- ISysMenuService.java
- SysMenuServiceImpl.java
- ISysDeptService.java
- SysDeptServiceImpl.java
- DingTalkAuthClient.java
- ThirdPartyAuthClient.java
- ThirdPartyAuthClientFactory.java
- ThirdPartyUserInfo.java
- LoginParam.java
- UserPageParam.java
- LoginResultDTO.java
- UserInfoDTO.java
- UserListDTO.java
- UserStatsVO.java
- AuthUser.java
- AuthIdentity.java
- SysRole.java
- SysMenu.java
- SysDept.java
- SysUserRole.java
- SysRoleMenu.java
- SysUserDept.java
章节来源
- AuthApplication.java
- application.yml
核心组件
-
安全配置与安全过滤器
- SecurityConfig:定义全局安全策略、放行路径、跨域、会话策略、异常处理器注册等
- JwtAuthenticationFilter:解析请求头中的 JWT,构建并设置认证上下文
- TokenService:JWT 的签发、解析、刷新、黑名单/过期管理(如有)
- AuthLoginUser:封装当前登录用户及其角色、权限、数据权限范围
- DataScopeInterceptor:在业务查询前注入数据权限 SQL 片段,限制数据可见范围
- SecurityExceptionHandlers:统一安全相关异常处理与响应
-
认证与授权服务
- IAuthService/AuthServiceImpl:登录、登出、密码校验、第三方登录流程编排
- IAuthUserService/AuthUserServiceImpl:用户信息查询、状态校验、缓存(可选)、用户列表分页查询
- IAuthIdentityService/AuthIdentityServiceImpl:多身份源绑定与校验(手机号、邮箱、第三方)
- ISysRoleService/SysRoleServiceImpl:角色查询、角色-权限映射
- ISysMenuService/SysMenuServiceImpl:菜单树、按钮级权限标识
- ISysDeptService/SysDeptServiceImpl:部门树、用户-部门关联
-
第三方登录
- ThirdPartyAuthClient:第三方登录抽象接口
- DingTalkAuthClient:钉钉登录实现
- ThirdPartyAuthClientFactory:按类型创建对应第三方客户端
- ThirdPartyUserInfo:第三方返回的用户信息标准化
-
用户管理增强组件
- UserPageParam:用户列表分页查询参数,支持多维度筛选条件
- UserListDTO:用户列表数据传输对象,包含用户基本信息和关联信息
- UserStatsVO:用户统计视图对象,提供用户数量、状态分布等统计信息
-
领域模型与常量
- LoginParam/LoginResultDTO/UserInfoDTO:登录入参与结果
- UserPageParam/UserListDTO/UserStatsVO:用户列表分页查询和统计相关DTO
- AuthUser/AuthIdentity/SysRole/SysMenu/SysDept 等实体
- DataScopeEnum/IdentityTypeEnum/MenuTypeEnum:数据权限、身份类型、菜单类型
- AuthConstants:认证相关常量
章节来源
- SecurityConfig.java
- JwtAuthenticationFilter.java
- TokenService.java
- AuthLoginUser.java
- DataScopeInterceptor.java
- SecurityExceptionHandlers.java
- IAuthService.java
- AuthServiceImpl.java
- IAuthUserService.java
- AuthUserServiceImpl.java
- IAuthIdentityService.java
- AuthIdentityServiceImpl.java
- ISysRoleService.java
- SysRoleServiceImpl.java
- ISysMenuService.java
- SysMenuServiceImpl.java
- ISysDeptService.java
- SysDeptServiceImpl.java
- ThirdPartyAuthClient.java
- DingTalkAuthClient.java
- ThirdPartyAuthClientFactory.java
- ThirdPartyUserInfo.java
- LoginParam.java
- UserPageParam.java
- LoginResultDTO.java
- UserInfoDTO.java
- UserListDTO.java
- UserStatsVO.java
- AuthUser.java
- AuthIdentity.java
- SysRole.java
- SysMenu.java
- SysDept.java
- SysUserRole.java
- SysRoleMenu.java
- SysUserDept.java
- DataScopeEnum.java
- IdentityTypeEnum.java
- MenuTypeEnum.java
- AuthConstants.java
架构总览
认证服务以"控制器 -> 服务 -> 安全上下文"为主线,配合 JWT 过滤器与数据权限拦截器完成全链路鉴权。新增的用户列表功能通过分页查询和统计接口,提供更强大的用户管理能力。
sequenceDiagram
participant C as "客户端"
participant AC as "AuthController"
participant AS as "AuthServiceImpl"
participant AUS as "AuthUserServiceImpl"
participant AIS as "AuthIdentityServiceImpl"
participant TS as "TokenService"
participant JF as "JwtAuthenticationFilter"
participant DSI as "DataScopeInterceptor"
C->>AC : "POST /auth/login"
AC->>AS : "login(LoginParam)"
AS->>AUS : "校验用户状态/密码"
AS->>AIS : "校验身份绑定(手机/邮箱/第三方)"
AS-->>AC : "认证成功"
AC->>TS : "签发JWT(含用户ID/角色/权限/数据范围)"
TS-->>AC : "返回Token"
AC-->>C : "LoginResultDTO{token,...}"
C->>AC : "带Authorization的请求"
AC->>JF : "解析JWT并构建认证上下文"
JF->>DSI : "设置数据权限范围"
DSI-->>AC : "注入SQL数据范围片段"
AC-->>C : "受保护资源"
Note over C,AC : "新增:用户列表分页查询接口"
C->>AC : "GET /system/user/list?page=1&size=10"
AC->>AUS : "getUserPage(UserPageParam)"
AUS-->>AC : "Page<UserListDTO>"
AC-->>C : "分页用户列表数据"
图表来源
- AuthController.java
- AuthServiceImpl.java
- AuthUserServiceImpl.java
- AuthIdentityServiceImpl.java
- TokenService.java
- JwtAuthenticationFilter.java
- DataScopeInterceptor.java
- UserPageParam.java
- UserListDTO.java
详细组件分析
安全配置与过滤器链
- SecurityConfig:集中配置白名单、跨域、会话策略、异常处理器;将 JwtAuthenticationFilter 加入过滤器链;可配置是否启用基于注解的权限控制。
- JwtAuthenticationFilter:从请求头提取 Token,调用 TokenService 解析并填充认证上下文,供后续控制器与拦截器使用。
- DataScopeInterceptor:根据当前用户的 DataScopeEnum 与部门关系,动态拼接 SQL 条件,确保只返回允许的数据行。
- SecurityExceptionHandlers:捕获未认证、无权限、参数错误等异常,统一返回标准响应。
flowchart TD
Start(["请求进入"]) --> CheckPath["匹配白名单/静态资源"]
CheckPath --> |放行| Next["继续业务处理"]
CheckPath --> |需认证| Extract["提取Authorization头"]
Extract --> Parse["TokenService解析JWT"]
Parse --> Valid{"Token有效?"}
Valid --> |否| Deny["拒绝访问(401/403)"]
Valid --> |是| SetCtx["设置认证上下文(AuthLoginUser)"]
SetCtx --> Scope["DataScopeInterceptor注入数据范围"]
Scope --> Next
Next --> End(["返回响应"])
图表来源
- SecurityConfig.java
- JwtAuthenticationFilter.java
- TokenService.java
- DataScopeInterceptor.java
- SecurityExceptionHandlers.java
章节来源
- SecurityConfig.java
- JwtAuthenticationFilter.java
- TokenService.java
- DataScopeInterceptor.java
- SecurityExceptionHandlers.java
认证流程与令牌处理
- 登录流程:AuthController 接收 LoginParam,AuthServiceImpl 调用用户与身份服务进行校验,成功后由 TokenService 签发 JWT,返回 LoginResultDTO。
- 令牌处理:TokenService 负责生成、解析、刷新、失效策略;JwtAuthenticationFilter 在每个请求中解析并设置认证上下文。
- 会话管理:建议无状态化(JWT),如需限流或黑名单可在 TokenService 中扩展 Redis 存储。
sequenceDiagram
participant Client as "客户端"
participant AC as "AuthController"
participant AS as "AuthServiceImpl"
participant AUS as "AuthUserServiceImpl"
participant AIS as "AuthIdentityServiceImpl"
participant TS as "TokenService"
Client->>AC : "POST /auth/login"
AC->>AS : "login(LoginParam)"
AS->>AUS : "查询用户/校验状态"
AS->>AIS : "校验身份绑定"
AS-->>AC : "成功"
AC->>TS : "createToken(user, roles, dataScope)"
TS-->>AC : "token"
AC-->>Client : "LoginResultDTO(token, userInfo)"
图表来源
- AuthController.java
- AuthServiceImpl.java
- AuthUserServiceImpl.java
- AuthIdentityServiceImpl.java
- TokenService.java
- LoginParam.java
- LoginResultDTO.java
章节来源
- AuthController.java
- AuthServiceImpl.java
- AuthUserServiceImpl.java
- AuthIdentityServiceImpl.java
- TokenService.java
- LoginParam.java
- LoginResultDTO.java
权限管理与数据权限控制
- 角色与菜单:SysRole 与 SysMenu 建立 RBAC 模型,支持菜单与按钮级权限标识。
- 用户-角色-部门:SysUserRole、SysUserDept 维护用户与角色、部门的关联。
- 数据权限:DataScopeEnum 定义数据可见范围(全部、本部门、本部门及以下、本人等),DataScopeInterceptor 根据当前用户范围注入 SQL 片段。
- 权限检查:可通过注解或拦截器对接口进行权限校验,结合菜单标识与角色集合判断。
classDiagram
class AuthUser {
+id
+username
+status
}
class SysRole {
+id
+name
+code
}
class SysMenu {
+id
+name
+type
+permission
}
class SysUserRole {
+userId
+roleId
}
class SysRoleMenu {
+roleId
+menuId
}
class SysDept {
+id
+name
+parentId
}
class SysUserDept {
+userId
+deptId
}
class DataScopeEnum {
+ALL
+DEPT
+DEPT_AND_BELOW
+SELF
}
AuthUser ||--o{ SysUserRole : "拥有"
SysRole ||--o{ SysUserRole : "分配给"
SysRole ||--o{ SysRoleMenu : "包含"
SysMenu ||--o{ SysRoleMenu : "被包含"
AuthUser ||--o{ SysUserDept : "属于"
SysDept ||--o{ SysUserDept : "包含"
图表来源
- AuthUser.java
- SysRole.java
- SysMenu.java
- SysUserRole.java
- SysRoleMenu.java
- SysDept.java
- SysUserDept.java
- DataScopeEnum.java
章节来源
- ISysRoleService.java
- SysRoleServiceImpl.java
- ISysMenuService.java
- SysMenuServiceImpl.java
- ISysDeptService.java
- SysDeptServiceImpl.java
- DataScopeInterceptor.java
- DataScopeTables.java
- DataScopeEnum.java
第三方登录集成(钉钉)
- 抽象与工厂:ThirdPartyAuthClient 定义统一接口,ThirdPartyAuthClientFactory 根据类型创建具体客户端。
- 钉钉实现:DingTalkAuthClient 对接钉钉 API,获取用户信息并转换为 ThirdPartyUserInfo。
- 集成流程:前端跳转钉钉授权 -> 回调携带 code -> 服务端换取 access_token -> 拉取用户信息 -> 本地用户绑定/自动注册 -> 签发 JWT。
sequenceDiagram
participant Client as "客户端"
participant AC as "AuthController"
participant AS as "AuthServiceImpl"
participant DTAC as "DingTalkAuthClient"
participant TS as "TokenService"
Client->>AC : "GET /auth/thirdparty/dingtalk/callback?code=..."
AC->>AS : "thirdPartyLogin(type, code)"
AS->>DTAC : "getAccessToken(code)"
DTAC-->>AS : "accessToken"
AS->>DTAC : "getUserInfo(accessToken)"
DTAC-->>AS : "ThirdPartyUserInfo"
AS->>AS : "查找/绑定本地用户"
AS->>TS : "createToken(user, roles, dataScope)"
TS-->>AC : "token"
AC-->>Client : "LoginResultDTO(token)"
图表来源
- AuthController.java
- AuthServiceImpl.java
- DingTalkAuthClient.java
- ThirdPartyAuthClient.java
- ThirdPartyAuthClientFactory.java
- ThirdPartyUserInfo.java
- TokenService.java
章节来源
- DingTalkAuthClient.java
- ThirdPartyAuthClient.java
- ThirdPartyAuthClientFactory.java
- ThirdPartyUserInfo.java
- AuthServiceImpl.java
- AuthController.java
用户与会话管理
- 用户上下文:AuthLoginUser 封装用户基本信息、角色、权限、数据权限范围,便于全链路使用。
- 会话策略:推荐无状态 JWT;如需在线用户统计、强制下线等,可在 TokenService 中引入 Redis 做黑名单或在线列表。
- 初始化数据:DataInitializer 用于启动时预置基础角色、菜单、部门等数据。
新增用户列表管理功能
- UserPageParam:分页查询参数,支持用户名、手机号、状态等多维度筛选
- UserListDTO:用户列表数据传输对象,包含用户基本信息、角色、部门等关联信息
- UserStatsVO:用户统计视图对象,提供用户总数、状态分布、部门分布等统计信息
- 分页查询优化:支持高效的数据库分页查询,减少内存占用和网络传输
章节来源
- AuthLoginUser.java
- TokenService.java
- DataInitializer.java
- UserPageParam.java
- UserListDTO.java
- UserStatsVO.java
用户列表分页查询功能
新增的分页查询功能为用户管理提供了强大的数据展示和分析能力:
- 分页参数设计:UserPageParam 支持灵活的查询条件组合,包括用户名模糊搜索、手机号精确匹配、用户状态筛选、部门选择等
- 数据传输优化:UserListDTO 精简了用户信息字段,避免敏感数据泄露,同时包含必要的关联信息
- 统计分析能力:UserStatsVO 提供用户数据的统计分析,帮助管理员了解用户分布和使用情况
- 性能优化:采用 MyBatis Plus 分页插件,支持高效的大数据量分页查询
sequenceDiagram
participant Admin as "管理员"
participant AC as "AuthController"
participant AUS as "AuthUserServiceImpl"
participant DB as "数据库"
Admin->>AC : "GET /system/user/list?page=1&size=10&keyword=admin"
AC->>AUS : "getUserPage(UserPageParam)"
AUS->>DB : "SELECT * FROM auth_user WHERE username LIKE '%admin%' LIMIT 10"
DB-->>AUS : "分页用户数据"
AUS-->>AC : "Page<UserListDTO>"
AC-->>Admin : "分页用户列表 + 统计信息"
Note over Admin,DB : "支持多维度筛选和分页展示"
图表来源
- AuthController.java
- AuthUserServiceImpl.java
- UserPageParam.java
- UserListDTO.java
- UserStatsVO.java
章节来源
- UserPageParam.java
- UserListDTO.java
- UserStatsVO.java
- AuthUserServiceImpl.java
依赖关系分析
- 控制器依赖服务层,服务层依赖领域模型与枚举,安全组件贯穿请求生命周期。
- 第三方登录通过工厂解耦不同平台实现,便于扩展。
- 数据权限通过拦截器与表名映射(DataScopeTables)组合,降低对业务代码侵入。
- 用户列表功能通过 DTO 模式解耦查询参数和返回数据,提高代码可维护性。
graph LR
AC["AuthController"] --> AS["AuthServiceImpl"]
AC --> AUS["AuthUserServiceImpl"]
AC --> AIS["AuthIdentityServiceImpl"]
SYSC["SystemController"] --> SRS["SysRoleServiceImpl"]
SYSC --> SMS["SysMenuServiceImpl"]
SYSC --> SDS["SysDeptServiceImpl"]
JF["JwtAuthenticationFilter"] --> TS["TokenService"]
DSI["DataScopeInterceptor"] --> ALU["AuthLoginUser"]
DTAC["DingTalkAuthClient"] --> TPACF["ThirdPartyAuthClientFactory"]
UPM["UserPageParam"] --> AUS
ULDTO["UserListDTO"] --> AC
USVO["UserStatsVO"] --> AC
图表来源
- AuthController.java
- AuthServiceImpl.java
- AuthUserServiceImpl.java
- AuthIdentityServiceImpl.java
- SystemController.java
- SysRoleServiceImpl.java
- SysMenuServiceImpl.java
- SysDeptServiceImpl.java
- JwtAuthenticationFilter.java
- TokenService.java
- DataScopeInterceptor.java
- AuthLoginUser.java
- DingTalkAuthClient.java
- ThirdPartyAuthClientFactory.java
- UserPageParam.java
- UserListDTO.java
- UserStatsVO.java
章节来源
- AuthController.java
- SystemController.java
- AuthServiceImpl.java
- AuthUserServiceImpl.java
- AuthIdentityServiceImpl.java
- SysRoleServiceImpl.java
- SysMenuServiceImpl.java
- SysDeptServiceImpl.java
- JwtAuthenticationFilter.java
- TokenService.java
- DataScopeInterceptor.java
- AuthLoginUser.java
- DingTalkAuthClient.java
- ThirdPartyAuthClientFactory.java
- UserPageParam.java
- UserListDTO.java
- UserStatsVO.java
性能考虑
- JWT 解析开销:避免在 TokenService 中进行重型计算;必要时缓存用户角色/权限集合。
- 数据权限 SQL 注入:尽量复用 MyBatis 分页插件与条件构造器,减少字符串拼接带来的性能损耗。
- 第三方登录:对钉钉等外部 API 调用增加超时与重试策略,避免阻塞主线程。
- 缓存策略:对菜单树、角色-权限映射、部门树等热点数据引入缓存(如 Redis)。
- 无状态会话:避免服务端 Session 存储,提升水平扩展能力。
- 分页查询优化:合理使用数据库索引,避免深分页问题,支持大数据量高效查询。
[本节为通用指导,不直接分析具体文件]
故障排查指南
- 常见错误
- 401 未认证:检查 Authorization 头格式、Token 是否过期、过滤器链是否生效
- 403 无权限:检查用户角色与接口权限标识是否匹配,菜单权限是否正确配置
- 数据越权:确认 DataScopeEnum 与用户-部门关系是否正确,拦截器是否注入成功
- 第三方登录失败:核对 AppKey/AppSecret、回调地址、网络连通性与签名校验
- 分页查询异常:检查分页参数合法性、数据库连接状态、索引使用情况
- 定位手段
- 开启调试日志,查看 JwtAuthenticationFilter 解析过程
- 打印 DataScopeInterceptor 注入的 SQL 片段,验证数据范围
- 检查 SecurityExceptionHandlers 返回的错误码与消息
- 监控分页查询性能,分析慢查询日志
- 修复建议
- 修正白名单配置,避免误放行敏感接口
- 完善用户-角色-部门关联数据
- 优化第三方客户端超时与重试配置
- 优化分页查询SQL,添加合适的数据库索引
章节来源
- JwtAuthenticationFilter.java
- SecurityExceptionHandlers.java
- DataScopeInterceptor.java
- DingTalkAuthClient.java
结论
认证服务模块通过清晰的分层设计与安全组件协作,实现了完整的认证、授权与数据权限控制能力。新增的用户列表分页查询功能进一步增强了用户管理能力,提供了更高效的数据展示和统计分析能力。 JWT 无状态化提升了可扩展性,RBAC 与数据权限满足企业级权限需求,第三方登录框架便于快速接入新平台。建议在部署时关注安全配置、缓存策略与外部依赖稳定性,以获得更好的性能与可靠性。
[本节为总结,不直接分析具体文件]
附录
- 安全最佳实践
- 最小权限原则:仅授予必要角色与菜单权限
- 强口令策略与登录失败锁定
- HTTPS 传输与 Token 短期有效期
- 定期审计角色与权限变更
- 自定义扩展方法
- 新增第三方平台:实现 ThirdPartyAuthClient 接口并在工厂中注册
- 扩展数据权限:在 DataScopeInterceptor 中增加新的 DataScopeEnum 分支
- 增强权限校验:在 PermissionConfig 中启用注解式权限控制
- 扩展用户查询条件:在 UserPageParam 中添加新的筛选字段
- 用户列表功能使用指南
- 分页参数配置:合理设置 page 和 size 参数,避免过大分页影响性能
- 筛选条件组合:灵活运用用户名、手机号、状态等筛选条件
- 数据统计分析:利用 UserStatsVO 提供的统计信息进行数据分析
[本节为补充说明,不直接分析具体文件]