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.
445 lines
23 KiB
445 lines
23 KiB
|
1 month ago
|
# 安全配置
|
||
|
|
|
||
|
|
<cite>
|
||
|
|
**本文引用的文件**
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.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)
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
||
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
- [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.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)
|
||
|
|
- [AuthService.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)
|
||
|
|
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java)
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
</cite>
|
||
|
|
|
||
|
|
## 目录
|
||
|
|
1. [简介](#简介)
|
||
|
|
2. [项目结构](#项目结构)
|
||
|
|
3. [核心组件](#核心组件)
|
||
|
|
4. [架构总览](#架构总览)
|
||
|
|
5. [详细组件分析](#详细组件分析)
|
||
|
|
6. [依赖关系分析](#依赖关系分析)
|
||
|
|
7. [性能考量](#性能考量)
|
||
|
|
8. [故障排查指南](#故障排查指南)
|
||
|
|
9. [结论](#结论)
|
||
|
|
10. [附录](#附录)
|
||
|
|
|
||
|
|
## 简介
|
||
|
|
本文件面向安全配置与鉴权体系,覆盖JWT认证、用户权限、跨域、过滤器链、第三方登录集成、密码加密、会话管理、CSRF防护、安全审计日志、异常处理与安全漏洞防护策略。文档以代码级为依据,结合流程图与类图帮助读者快速理解并落地实施。
|
||
|
|
|
||
|
|
## 项目结构
|
||
|
|
本项目采用多模块结构,安全相关能力集中在 crm-auth(认证与授权)与 crm-base(通用基础能力)两个模块:
|
||
|
|
- crm-auth:负责认证控制器、JWT过滤器、令牌服务、权限配置、数据范围拦截器、第三方登录客户端等。
|
||
|
|
- crm-base:提供全局异常处理、CORS跨域、追踪ID过滤器、通用安全工具类等。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph TB
|
||
|
|
subgraph "应用入口"
|
||
|
|
APP["应用启动<br/>application.yml"]
|
||
|
|
end
|
||
|
|
subgraph "认证与授权(crm-auth)"
|
||
|
|
SEC_CFG["SecurityConfig<br/>安全配置"]
|
||
|
|
AUTH_CTRL["AuthController<br/>登录/登出/刷新"]
|
||
|
|
JWT_FILTER["JwtAuthenticationFilter<br/>JWT过滤器"]
|
||
|
|
TOKEN_SVC["TokenService<br/>令牌生成/校验"]
|
||
|
|
PERM_CFG["PermissionConfig<br/>权限规则"]
|
||
|
|
DATA_SCOPE_INT["DataScopeInterceptor<br/>数据范围拦截"]
|
||
|
|
EXC_HANDLERS["SecurityExceptionHandlers<br/>安全异常处理"]
|
||
|
|
DINGTALK["DingTalkAuthClient<br/>钉钉登录"]
|
||
|
|
TP_FACTORY["ThirdPartyAuthClientFactory<br/>第三方工厂"]
|
||
|
|
TP_INFO["ThirdPartyUserInfo<br/>第三方用户信息"]
|
||
|
|
end
|
||
|
|
subgraph "基础能力(crm-base)"
|
||
|
|
CORS["CorsConfig<br/>跨域配置"]
|
||
|
|
GLOBAL_EXC["GlobalExceptionHandlerAdvice<br/>全局异常"]
|
||
|
|
TRACE["TraceIdFilter<br/>链路追踪"]
|
||
|
|
end
|
||
|
|
APP --> SEC_CFG
|
||
|
|
SEC_CFG --> JWT_FILTER
|
||
|
|
SEC_CFG --> PERM_CFG
|
||
|
|
AUTH_CTRL --> TOKEN_SVC
|
||
|
|
AUTH_CTRL --> DINGTALK
|
||
|
|
DINGTALK --> TP_FACTORY
|
||
|
|
TP_FACTORY --> TP_INFO
|
||
|
|
SEC_CFG --> DATA_SCOPE_INT
|
||
|
|
SEC_CFG --> EXC_HANDLERS
|
||
|
|
SEC_CFG --> CORS
|
||
|
|
SEC_CFG --> TRACE
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.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)
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
||
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.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)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
|
||
|
|
## 核心组件
|
||
|
|
- 安全配置与过滤器链:通过统一安全配置装配JWT过滤器、跨域、异常处理器、数据范围拦截器等,形成请求进入业务前的完整安全链。
|
||
|
|
- 令牌服务:负责JWT令牌的签发、解析、刷新与黑名单/过期策略(如使用缓存)。
|
||
|
|
- 认证控制器:封装登录、登出、刷新令牌、第三方登录回调等接口。
|
||
|
|
- 权限配置:定义URL级别的访问控制、角色/权限映射与数据范围策略。
|
||
|
|
- 第三方登录:抽象第三方认证客户端与工厂,支持扩展更多平台。
|
||
|
|
- 基础安全能力:全局异常处理、跨域、链路追踪等。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
||
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
- [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
|
||
|
|
## 架构总览
|
||
|
|
下图展示一次“用户名+密码”登录的端到端流程,涵盖过滤器链、令牌服务、用户服务与权限加载。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant Client as "客户端"
|
||
|
|
participant Filter as "JwtAuthenticationFilter"
|
||
|
|
participant Controller as "AuthController"
|
||
|
|
participant TokenSvc as "TokenService"
|
||
|
|
participant AuthSrv as "IAuthService"
|
||
|
|
participant UserMapper as "AuthUserMapper"
|
||
|
|
participant MenuMapper as "SysMenuMapper"
|
||
|
|
Client->>Filter : "POST /auth/login"
|
||
|
|
Filter-->>Controller : "放行到控制器"
|
||
|
|
Controller->>AuthSrv : "验证用户名/密码"
|
||
|
|
AuthSrv->>UserMapper : "查询用户与状态"
|
||
|
|
UserMapper-->>AuthSrv : "用户实体"
|
||
|
|
AuthSrv-->>Controller : "认证成功"
|
||
|
|
Controller->>TokenSvc : "签发JWT(含角色/权限)"
|
||
|
|
TokenSvc-->>Controller : "返回令牌"
|
||
|
|
Controller-->>Client : "登录成功响应"
|
||
|
|
Note over Filter,Controller : "后续请求携带Authorization头<br/>由过滤器完成鉴权与上下文注入"
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.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)
|
||
|
|
- [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java)
|
||
|
|
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java)
|
||
|
|
|
||
|
|
## 详细组件分析
|
||
|
|
|
||
|
|
### JWT认证与令牌服务
|
||
|
|
- 令牌生成:在认证成功后,根据用户主体信息(含角色、权限)生成JWT,设置有效期与必要声明。
|
||
|
|
- 令牌校验:过滤器从请求头提取令牌,解析并写入安全上下文,供后续鉴权使用。
|
||
|
|
- 令牌刷新:提供刷新接口,基于旧令牌签发新令牌,可配合黑名单或Redis实现主动失效。
|
||
|
|
- 安全建议:
|
||
|
|
- 使用强随机密钥与合适的算法;避免将敏感信息放入令牌载荷。
|
||
|
|
- 合理设置过期时间,结合刷新机制平衡体验与安全。
|
||
|
|
- 对敏感操作增加二次确认或短期令牌。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
classDiagram
|
||
|
|
class TokenService {
|
||
|
|
+签发令牌(用户信息)
|
||
|
|
+解析令牌()
|
||
|
|
+刷新令牌(旧令牌)
|
||
|
|
+校验令牌有效性()
|
||
|
|
}
|
||
|
|
class JwtAuthenticationFilter {
|
||
|
|
+doFilter(请求, 响应, 过滤器链)
|
||
|
|
-解析Authorization头()
|
||
|
|
-写入安全上下文()
|
||
|
|
}
|
||
|
|
class AuthLoginUser {
|
||
|
|
+用户标识
|
||
|
|
+角色集合
|
||
|
|
+权限集合
|
||
|
|
+是否有效()
|
||
|
|
}
|
||
|
|
TokenService <.. JwtAuthenticationFilter : "解析/校验"
|
||
|
|
JwtAuthenticationFilter --> AuthLoginUser : "构建上下文"
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
||
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
||
|
|
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
||
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
||
|
|
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
|
||
|
|
|
||
|
|
### 用户登录流程
|
||
|
|
- 输入校验:控制器接收登录参数并进行基础校验。
|
||
|
|
- 身份验证:调用认证服务校验用户名/密码及账户状态。
|
||
|
|
- 权限加载:成功后加载用户角色与菜单权限,写入令牌载荷。
|
||
|
|
- 响应输出:返回令牌及相关用户信息。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TD
|
||
|
|
Start(["开始"]) --> Validate["参数校验"]
|
||
|
|
Validate --> Valid{"校验通过?"}
|
||
|
|
Valid --> |否| Error["返回参数错误"]
|
||
|
|
Valid --> |是| CheckPwd["校验密码与状态"]
|
||
|
|
CheckPwd --> PwdOk{"密码正确且可用?"}
|
||
|
|
PwdOk --> |否| AuthFail["返回认证失败"]
|
||
|
|
PwdOk --> |是| LoadPerm["加载角色与权限"]
|
||
|
|
LoadPerm --> GenToken["生成JWT"]
|
||
|
|
GenToken --> ReturnResp["返回登录结果"]
|
||
|
|
ReturnResp --> End(["结束"])
|
||
|
|
AuthFail --> End
|
||
|
|
Error --> End
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.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)
|
||
|
|
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.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)
|
||
|
|
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java)
|
||
|
|
|
||
|
|
### 权限与数据范围拦截
|
||
|
|
- URL级权限:通过权限配置定义白名单与受保护路径,结合角色/权限进行拦截。
|
||
|
|
- 数据范围:通过拦截器注入数据可见性上下文,影响查询SQL的数据范围过滤。
|
||
|
|
- 最佳实践:
|
||
|
|
- 最小权限原则,默认拒绝未授权访问。
|
||
|
|
- 将静态资源与公开接口加入白名单,减少不必要的鉴权开销。
|
||
|
|
- 数据范围按租户/部门维度隔离,避免越权访问。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
classDiagram
|
||
|
|
class PermissionConfig {
|
||
|
|
+配置白名单
|
||
|
|
+配置受保护路径
|
||
|
|
+角色/权限映射
|
||
|
|
}
|
||
|
|
class DataScopeInterceptor {
|
||
|
|
+preHandle(请求, 响应, 处理器)
|
||
|
|
-读取用户数据范围
|
||
|
|
-注入可见性上下文
|
||
|
|
}
|
||
|
|
PermissionConfig <.. DataScopeInterceptor : "读取策略"
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
||
|
|
|
||
|
|
### 跨域与安全过滤器链
|
||
|
|
- 跨域配置:统一允许的来源、方法与头部,限制暴露头与凭据策略。
|
||
|
|
- 过滤器链顺序:追踪ID过滤器 -> 跨域处理 -> JWT过滤器 -> 权限拦截 -> 业务控制器。
|
||
|
|
- 建议:
|
||
|
|
- 生产环境严格限制允许的源与方法。
|
||
|
|
- 开启必要的请求体大小限制与超时配置。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant Client as "客户端"
|
||
|
|
participant Trace as "TraceIdFilter"
|
||
|
|
participant CORS as "CorsConfig"
|
||
|
|
participant JWT as "JwtAuthenticationFilter"
|
||
|
|
participant Perm as "PermissionConfig"
|
||
|
|
participant Ctrl as "AuthController"
|
||
|
|
Client->>Trace : "HTTP请求"
|
||
|
|
Trace-->>CORS : "设置追踪ID"
|
||
|
|
CORS-->>JWT : "跨域预检/实际请求"
|
||
|
|
JWT-->>Perm : "鉴权检查"
|
||
|
|
Perm-->>Ctrl : "放行至控制器"
|
||
|
|
Ctrl-->>Client : "响应"
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
|
||
|
|
### 第三方登录集成
|
||
|
|
- 抽象客户端:定义统一的第三方认证客户端接口与用户信息模型。
|
||
|
|
- 工厂模式:根据平台类型创建对应客户端实例,便于扩展新平台。
|
||
|
|
- 典型流程:前端跳转第三方授权 -> 回调服务端 -> 获取第三方用户信息 -> 绑定本地用户 -> 签发JWT。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
classDiagram
|
||
|
|
class ThirdPartyAuthClientFactory {
|
||
|
|
+创建客户端(平台类型)
|
||
|
|
}
|
||
|
|
class DingTalkAuthClient {
|
||
|
|
+获取授权码
|
||
|
|
+换取AccessToken
|
||
|
|
+拉取用户信息()
|
||
|
|
}
|
||
|
|
class ThirdPartyUserInfo {
|
||
|
|
+第三方用户标识
|
||
|
|
+昵称/头像
|
||
|
|
+邮箱/手机号
|
||
|
|
}
|
||
|
|
ThirdPartyAuthClientFactory --> DingTalkAuthClient : "创建实例"
|
||
|
|
DingTalkAuthClient --> ThirdPartyUserInfo : "返回用户信息"
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
||
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
||
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
||
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
||
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
||
|
|
|
||
|
|
### 安全异常处理与审计日志
|
||
|
|
- 全局异常:统一捕获业务异常、权限异常、资源不存在等,返回标准化响应。
|
||
|
|
- 安全异常:针对认证失败、令牌无效、越权访问等给出明确但不过度泄露信息的提示。
|
||
|
|
- 审计日志:记录关键安全事件(登录成功/失败、权限拒绝、第三方登录回调),包含追踪ID与IP。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TD
|
||
|
|
A["异常发生"] --> B{"异常类型"}
|
||
|
|
B --> |业务异常| C["业务异常处理器"]
|
||
|
|
B --> |权限异常| D["权限异常处理器"]
|
||
|
|
B --> |系统异常| E["系统异常处理器"]
|
||
|
|
C --> F["记录审计日志"]
|
||
|
|
D --> F
|
||
|
|
E --> F
|
||
|
|
F --> G["返回统一错误响应"]
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
||
|
|
- [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
||
|
|
- [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
|
||
|
|
## 依赖关系分析
|
||
|
|
- 控制器依赖服务层,服务层依赖Mapper进行数据访问。
|
||
|
|
- 安全过滤器依赖令牌服务与安全上下文对象。
|
||
|
|
- 权限配置与数据范围拦截器共同决定访问控制与数据可见性。
|
||
|
|
- 第三方登录通过工厂动态选择客户端,降低耦合。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph LR
|
||
|
|
AuthCtrl["AuthController"] --> IAuthSrv["IAuthService"]
|
||
|
|
IAuthSrv --> AuthUserMapper["AuthUserMapper"]
|
||
|
|
IAuthSrv --> SysMenuMapper["SysMenuMapper"]
|
||
|
|
JwtFilter["JwtAuthenticationFilter"] --> TokenSvc["TokenService"]
|
||
|
|
JwtFilter --> AuthLoginUser["AuthLoginUser"]
|
||
|
|
PermCfg["PermissionConfig"] --> DataScopeInt["DataScopeInterceptor"]
|
||
|
|
TPFactory["ThirdPartyAuthClientFactory"] --> DingTalk["DingTalkAuthClient"]
|
||
|
|
DingTalk --> TPInfo["ThirdPartyUserInfo"]
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
||
|
|
- [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java)
|
||
|
|
- [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.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)
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
||
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
||
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
||
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.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)
|
||
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
||
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
||
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
||
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
||
|
|
|
||
|
|
## 性能考量
|
||
|
|
- 令牌解析与校验应尽可能轻量,必要时引入缓存以减少重复计算。
|
||
|
|
- 权限与菜单加载可缓存热点数据,降低数据库压力。
|
||
|
|
- 跨域预检请求较多时,合理设置预检缓存时间。
|
||
|
|
- 审计日志异步落盘,避免阻塞主流程。
|
||
|
|
- 连接池与线程池参数需根据压测调优。
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 故障排查指南
|
||
|
|
- 登录失败:检查用户名/密码、账户状态、第三方回调参数是否正确。
|
||
|
|
- 令牌无效:检查Authorization头格式、令牌是否过期或被吊销。
|
||
|
|
- 权限拒绝:核对角色/权限映射与路径白名单配置。
|
||
|
|
- 跨域错误:检查允许的源、方法、头部与凭据策略。
|
||
|
|
- 审计定位:通过追踪ID关联日志,定位请求全链路。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
||
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
- [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
|
||
|
|
## 结论
|
||
|
|
本项目的安全体系以JWT为核心,结合过滤器链、权限配置与数据范围拦截,实现了完整的认证与授权闭环。通过第三方登录工厂化设计,具备良好的可扩展性。配合全局异常处理与审计日志,提升了系统的可观测性与可维护性。建议在生产环境中持续优化令牌策略、权限缓存与审计性能,确保安全性与性能兼顾。
|
||
|
|
|
||
|
|
[本节为总结性内容,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 附录
|
||
|
|
- 安全策略配置要点:
|
||
|
|
- 最小权限原则与默认拒绝。
|
||
|
|
- 严格的跨域与CORS策略。
|
||
|
|
- 合理的令牌生命周期与刷新机制。
|
||
|
|
- 敏感操作二次确认与短期令牌。
|
||
|
|
- 密码加密规则:
|
||
|
|
- 使用强哈希算法与盐值,禁止明文存储。
|
||
|
|
- 定期轮换密钥与升级算法。
|
||
|
|
- 会话管理与CSRF防护:
|
||
|
|
- 无状态JWT为主,必要时结合黑名单或Redis。
|
||
|
|
- 若启用Cookie会话,需开启CSRF防护并限制SameSite。
|
||
|
|
- 安全漏洞防护:
|
||
|
|
- 输入校验与输出编码,防止XSS/注入。
|
||
|
|
- 速率限制与防重放攻击。
|
||
|
|
- 安全头配置(HSTS、CSP等)。
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|