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.

364 lines
18 KiB

1 month ago
# 安全配置
<cite>
**本文引用的文件**
- [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)
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.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)
- [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)
- [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. [附录](#附录)
## 简介
本文件面向CRM系统的安全配置,聚焦以下目标:
- 深入解析Spring Security主配置类(SecurityConfig)的过滤器链、异常处理、密码编码器与Bean注册。
- 说明权限配置(PermissionConfig)的作用,包括接口白名单、忽略路径与URL匹配规则。
- 解释跨域配置(CorsConfig)的安全考量与最佳实践。
- 梳理认证相关属性(AuthProperties)与配置文件示例。
- 提供自定义过滤器添加方式、URL匹配策略与安全建议。
## 项目结构
本项目采用多模块组织,安全能力主要分布在以下模块:
- crm-auth:认证授权核心,包含SecurityConfig、PermissionConfig、AuthProperties、JWT过滤器、令牌服务与异常处理器等。
- crm-base:基础能力,包含全局异常处理、跨域配置、通用工具与数据可见性控制等。
- crm-app:应用启动入口与全局配置聚合。
```mermaid
graph TB
subgraph "认证授权模块(crm-auth)"
A["SecurityConfig"] --> B["PermissionConfig"]
A --> C["JwtAuthenticationFilter"]
A --> D["SecurityExceptionHandlers"]
C --> E["TokenService"]
F["AuthProperties"] --> A
end
subgraph "基础模块(crm-base)"
G["CorsConfig"]
H["GlobalExceptionHandlerAdvice"]
end
subgraph "应用层(crm-app)"
I["application.yml"]
end
A --> G
D --> H
I --> A
I --> G
```
图表来源
- [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)
- [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)
- [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)
- [application.yml](file://crm-app/src/main/resources/application.yml)
- [application.yml](file://crm-auth/src/main/resources/application.yml)
章节来源
- [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)
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
- [application.yml](file://crm-auth/src/main/resources/application.yml)
## 核心组件
- SecurityConfig:Spring Security主配置,负责构建过滤器链、注册自定义过滤器、设置请求授权规则、配置异常处理与密码编码器。
- PermissionConfig:权限与访问控制配置,集中管理接口白名单、忽略路径、URL匹配策略与鉴权注解生效范围。
- JwtAuthenticationFilter:基于JWT的请求级认证过滤器,负责从请求头提取并校验令牌,填充认证上下文。
- TokenService:令牌生成、刷新、校验与解析的核心服务。
- SecurityExceptionHandlers:统一安全异常处理器,将未认证、无权限等异常转换为标准响应。
- CorsConfig:跨域配置,定义允许的源、方法、头部与凭据策略,保障跨域安全。
- GlobalExceptionHandlerAdvice:全局异常处理,统一业务与系统异常的返回格式。
- AuthProperties:认证相关的外部化配置项,如JWT密钥、过期时间、白名单开关等。
章节来源
- [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)
- [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)
- [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)
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
## 架构总览
下图展示了请求进入后的安全处理流程:跨域预处理、JWT认证、权限判定、业务控制器执行与异常统一处理。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Web as "Web容器"
participant CORS as "CorsConfig"
participant SEC as "SecurityConfig过滤器链"
participant JWT as "JwtAuthenticationFilter"
participant TKN as "TokenService"
participant PERM as "PermissionConfig"
participant CTRL as "业务控制器"
participant EXC as "SecurityExceptionHandlers/GlobalExceptionHandlerAdvice"
Client->>Web : HTTP请求
Web->>CORS : 预检/跨域检查
CORS-->>Web : 允许或拒绝
Web->>SEC : 进入安全过滤器链
SEC->>JWT : 解析并校验JWT
JWT->>TKN : 验证令牌有效性
TKN-->>JWT : 令牌状态
JWT-->>SEC : 填充认证上下文
SEC->>PERM : 判断是否白名单/忽略路径
alt 白名单或忽略路径
PERM-->>SEC : 放行
else 需要鉴权
PERM-->>SEC : 继续鉴权
end
SEC->>CTRL : 调用业务逻辑
CTRL-->>Client : 正常响应
Note over SEC,EXC : 若发生未认证/无权限等异常
SEC->>EXC : 抛出安全异常
EXC-->>Client : 统一错误响应
```
图表来源
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.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)
- [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)
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
## 详细组件分析
### SecurityConfig主配置类
职责与要点:
- 构建Spring Security过滤器链:按顺序注册跨域、认证、授权、异常处理等过滤器。
- 自定义过滤器注入:将JwtAuthenticationFilter加入过滤器链,并在适当位置进行认证前置或后置处理。
- URL匹配规则:结合Ant风格或正则表达式对路径进行放行或保护;与PermissionConfig协同实现白名单与忽略路径。
- 异常处理:注册SecurityExceptionHandlers,将未认证、无权限等异常转为统一响应。
- 密码编码器:配置BCryptPasswordEncoder或其他强哈希算法,确保密码存储安全。
- Bean注册:暴露必要的Security相关Bean(如认证管理器、授权决策器等),便于扩展。
```mermaid
classDiagram
class SecurityConfig {
+configure(HttpSecurity)
+registerFilters()
+configureAuthorization()
+configureExceptionHandling()
+passwordEncoder()
+securityContext()
}
class JwtAuthenticationFilter {
+doFilterInternal(request,response,filterChain)
}
class SecurityExceptionHandlers {
+handleUnauthorized()
+handleForbidden()
+handleAccessDenied()
}
class PasswordEncoder {
+encode(password)
+matches(raw,password)
}
SecurityConfig --> JwtAuthenticationFilter : "注册到过滤器链"
SecurityConfig --> SecurityExceptionHandlers : "注册异常处理器"
SecurityConfig --> PasswordEncoder : "配置密码编码器"
```
图表来源
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
章节来源
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
### PermissionConfig权限配置
职责与要点:
- 接口白名单:定义无需鉴权的公开接口集合,常用于登录、健康检查、静态资源等。
- 忽略路径:与白名单类似,但可能用于特定场景(如监控、审计)的免鉴权访问。
- URL匹配规则:支持Ant风格路径匹配,便于灵活配置不同层级与通配符。
- 与SecurityConfig协作:在授权阶段优先判断是否命中白名单或忽略路径,命中则直接放行。
```mermaid
flowchart TD
Start(["进入授权阶段"]) --> CheckWhitelist{"是否命中白名单?"}
CheckWhitelist --> |是| Allow["放行请求"]
CheckWhitelist --> |否| CheckIgnore{"是否命中忽略路径?"}
CheckIgnore --> |是| Allow
CheckIgnore --> |否| RequireAuth["需要鉴权"]
RequireAuth --> End(["结束"])
Allow --> End
```
图表来源
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.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)
### CorsConfig跨域配置
安全考虑与建议:
- 限制允许的源(Origin)为受信任域名,避免使用“*”在生产环境。
- 明确允许的HTTP方法与头部,最小化暴露面。
- 谨慎启用凭据(AllowCredentials),仅在必要时开启并确保源严格限定。
- 与SecurityConfig配合,确保跨域预检请求不被误拦截。
```mermaid
flowchart TD
Preflight["浏览器预检请求"] --> ValidateOrigin{"来源是否受信任?"}
ValidateOrigin --> |否| Deny["拒绝跨域"]
ValidateOrigin --> |是| CheckMethods{"方法是否允许?"}
CheckMethods --> |否| Deny
CheckMethods --> |是| CheckHeaders{"头部是否允许?"}
CheckHeaders --> |否| Deny
CheckHeaders --> |是| Allow["允许跨域"]
```
图表来源
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
章节来源
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
### AuthProperties认证属性
作用与常见字段:
- JWT密钥、算法、过期时间、刷新策略等。
- 白名单开关、忽略路径列表、默认角色或权限策略。
- 通过外部化配置(application.yml)注入,便于不同环境差异化配置。
章节来源
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
- [application.yml](file://crm-auth/src/main/resources/application.yml)
- [application.yml](file://crm-app/src/main/resources/application.yml)
### 自定义过滤器与异常处理
- JwtAuthenticationFilter:从请求头提取JWT,调用TokenService校验,成功后填充认证上下文供后续鉴权使用。
- SecurityExceptionHandlers:捕获未认证、无权限等异常,输出统一错误码与消息,便于前端处理。
- GlobalExceptionHandlerAdvice:统一业务异常与系统异常,保证响应一致性。
```mermaid
sequenceDiagram
participant Filter as "JwtAuthenticationFilter"
participant Token as "TokenService"
participant SecEx as "SecurityExceptionHandlers"
participant GlobalEx as "GlobalExceptionHandlerAdvice"
Filter->>Token : 校验JWT
Token-->>Filter : 成功/失败
alt 失败
Filter->>SecEx : 抛出未认证/无效令牌异常
SecEx-->>GlobalEx : 统一异常转换
GlobalEx-->>Client : 标准错误响应
else 成功
Filter-->>Next : 继续过滤器链
end
```
图表来源
- [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)
- [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)
章节来源
- [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)
- [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)
## 依赖关系分析
- SecurityConfig依赖JwtAuthenticationFilter、SecurityExceptionHandlers、PasswordEncoder与PermissionConfig。
- JwtAuthenticationFilter依赖TokenService进行令牌校验。
- CorsConfig独立于安全过滤器链,但在请求早期进行跨域处理。
- GlobalExceptionHandlerAdvice作为全局异常处理,接收来自安全与业务层的异常。
```mermaid
graph LR
SC["SecurityConfig"] --> JF["JwtAuthenticationFilter"]
SC --> SEH["SecurityExceptionHandlers"]
SC --> PE["PasswordEncoder"]
SC --> PC["PermissionConfig"]
JF --> TS["TokenService"]
CC["CorsConfig"] --> SC
SEH --> GHA["GlobalExceptionHandlerAdvice"]
```
图表来源
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.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)
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.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)
章节来源
- [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)
- [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)
- [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)
## 性能考虑
- 过滤器链尽量精简,避免在认证前执行重型逻辑。
- 令牌校验应缓存热点信息(如用户会话、角色),减少重复计算。
- 跨域预检请求需快速返回,避免阻塞。
- 白名单与忽略路径匹配建议使用高效数据结构(如Set或Trie)。
- 密码编码选择合适强度,平衡安全性与性能。
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
常见问题与定位步骤:
- 401未认证:检查JwtAuthenticationFilter是否正确读取请求头、TokenService是否有效、白名单是否遗漏。
- 403无权限:确认PermissionConfig白名单与忽略路径配置、授权规则是否覆盖该接口。
- 跨域失败:核对CorsConfig的源、方法与头部配置,确保生产环境不使用“*”。
- 密码校验失败:确认PasswordEncoder配置与用户密码存储格式一致。
- 异常响应不一致:检查SecurityExceptionHandlers与GlobalExceptionHandlerAdvice的映射关系。
章节来源
- [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)
- [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)
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
## 结论
通过SecurityConfig、PermissionConfig、JwtAuthenticationFilter、TokenService与CorsConfig的协同,CRM系统实现了完整的认证、授权与跨域安全能力。合理配置白名单、忽略路径与跨域策略,结合统一的异常处理与密码编码器,可显著提升系统的安全性与可维护性。
[本节为总结,不直接分析具体文件]
## 附录
- 配置文件示例(application.yml)建议:
- 认证相关:JWT密钥、算法、过期时间、刷新策略、白名单开关、忽略路径列表。
- 跨域相关:允许的源、方法、头部、是否允许凭据。
- 安全相关:密码编码器类型、默认角色与权限策略。
- 安全最佳实践:
- 生产环境禁用调试端点与敏感接口。
- 严格限定跨域源与方法,避免使用“*”。
- 定期轮换JWT密钥与加密参数。
- 对敏感接口增加二次校验与限流。
- 统一异常响应格式,避免泄露内部细节。
[本节为补充内容,不直接分析具体文件]