|
|
|
|
# 认证API
|
|
|
|
|
|
|
|
|
|
<cite>
|
|
|
|
|
**本文引用的文件**
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
|
|
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
|
|
|
|
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
|
|
|
|
|
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
|
|
|
|
|
</cite>
|
|
|
|
|
|
|
|
|
|
## 更新摘要
|
|
|
|
|
**变更内容**
|
|
|
|
|
- AuthController增强了OpenAPI注解,为登录相关接口添加了@Operation注解和"登录"标签分类
|
|
|
|
|
- ResourceController完善了OpenAPI注解,为权限点管理接口添加了详细的@Operation注解和"权限点管理"标签
|
|
|
|
|
- 所有DTO类添加了@Schema注解,提供API文档的字段描述信息
|
|
|
|
|
- 改进了Swagger/OpenAPI文档生成质量,提供更好的API文档体验
|
|
|
|
|
|
|
|
|
|
## 目录
|
|
|
|
|
1. [简介](#简介)
|
|
|
|
|
2. [项目结构](#项目结构)
|
|
|
|
|
3. [核心组件](#核心组件)
|
|
|
|
|
4. [架构总览](#架构总览)
|
|
|
|
|
5. [详细组件分析](#详细组件分析)
|
|
|
|
|
6. [依赖关系分析](#依赖关系分析)
|
|
|
|
|
7. [性能考虑](#性能考虑)
|
|
|
|
|
8. [故障排查指南](#故障排查指南)
|
|
|
|
|
9. [结论](#结论)
|
|
|
|
|
10. [附录](#附录)
|
|
|
|
|
|
|
|
|
|
## 简介
|
|
|
|
|
本文件为认证模块的API文档,覆盖用户登录、登出、获取当前用户信息、权限资源管理等接口。文档包含:
|
|
|
|
|
- HTTP方法、URL路径、请求参数、响应格式与状态码
|
|
|
|
|
- JWT令牌生成与校验机制
|
|
|
|
|
- OAuth2集成流程(面向第三方平台)
|
|
|
|
|
- 权限验证方式(基于角色与菜单)
|
|
|
|
|
- 密码加密策略、会话管理与安全最佳实践
|
|
|
|
|
- 完整请求/响应示例(成功与失败场景)
|
|
|
|
|
- 第三方平台(钉钉)集成配置与使用示例
|
|
|
|
|
- OpenAPI/Swagger文档集成说明
|
|
|
|
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
认证模块位于 crm-auth 子模块中,主要包含控制器、安全配置、服务层、领域模型与第三方客户端。基础能力(统一结果封装、全局异常处理、工具类)位于 crm-base 模块。
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
graph TB
|
|
|
|
|
subgraph "crm-auth"
|
|
|
|
|
AC["AuthController<br/>@Tag: 认证"]
|
|
|
|
|
RC["ResourceController<br/>@Tag: 权限点管理"]
|
|
|
|
|
SC["SystemController"]
|
|
|
|
|
SEC["SecurityConfig"]
|
|
|
|
|
PERM["PermissionConfig"]
|
|
|
|
|
JAF["JwtAuthenticationFilter"]
|
|
|
|
|
TS["TokenService"]
|
|
|
|
|
DSI["DataScopeInterceptor"]
|
|
|
|
|
SEH["SecurityExceptionHandlers"]
|
|
|
|
|
SVC["IAuthService / AuthServiceImpl"]
|
|
|
|
|
DP["AuthProperties"]
|
|
|
|
|
ENT["AuthUser / AuthIdentity / SysRole / SysMenu"]
|
|
|
|
|
DTO["LoginResultDTO / UserInfoDTO / ResourceNode"]
|
|
|
|
|
DING["DingTalkAuthClient"]
|
|
|
|
|
TPC["ThirdPartyAuthClientFactory"]
|
|
|
|
|
end
|
|
|
|
|
subgraph "crm-base"
|
|
|
|
|
GHA["GlobalExceptionHandlerAdvice"]
|
|
|
|
|
RES["Result / ResultCodeEnum"]
|
|
|
|
|
end
|
|
|
|
|
AC --> SVC
|
|
|
|
|
RC --> SVC
|
|
|
|
|
SC --> SVC
|
|
|
|
|
AC --> TS
|
|
|
|
|
JAF --> TS
|
|
|
|
|
SEC --> JAF
|
|
|
|
|
SEC --> DSI
|
|
|
|
|
PERM --> SEC
|
|
|
|
|
SVC --> ENT
|
|
|
|
|
SVC --> DTO
|
|
|
|
|
DING --> TPC
|
|
|
|
|
AC --> DING
|
|
|
|
|
AC --> TPC
|
|
|
|
|
GHA --> RES
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
|
|
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
|
|
|
|
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
|
|
|
|
|
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java)
|
|
|
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.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)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
|
|
|
|
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
|
|
|
|
|
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
|
|
|
|
|
|
|
|
|
|
## 核心组件
|
|
|
|
|
- 控制器层
|
|
|
|
|
- 认证控制器:提供登录、登出、获取当前用户信息等接口,已添加OpenAPI注解
|
|
|
|
|
- 资源控制器:提供权限资源管理接口,已完善OpenAPI注解
|
|
|
|
|
- 系统控制器:提供系统级鉴权相关接口(如权限列表、菜单树等)
|
|
|
|
|
- 安全配置
|
|
|
|
|
- SecurityConfig:Spring Security配置,注册JWT过滤器、跨域、白名单等
|
|
|
|
|
- PermissionConfig:权限注解与数据权限拦截器装配
|
|
|
|
|
- 安全组件
|
|
|
|
|
- JwtAuthenticationFilter:从请求头解析JWT并构建认证上下文
|
|
|
|
|
- TokenService:JWT签发、校验、刷新与过期管理
|
|
|
|
|
- DataScopeInterceptor:数据范围拦截器,按角色/部门过滤数据
|
|
|
|
|
- SecurityExceptionHandlers:安全相关异常处理器
|
|
|
|
|
- 服务层
|
|
|
|
|
- IAuthService / AuthServiceImpl:认证业务逻辑(账号密码校验、第三方登录、用户信息查询、权限加载)
|
|
|
|
|
- 第三方登录
|
|
|
|
|
- DingTalkAuthClient:钉钉OAuth2客户端实现
|
|
|
|
|
- ThirdPartyAuthClientFactory:第三方认证客户端工厂
|
|
|
|
|
- 领域模型
|
|
|
|
|
- AuthUser:用户实体
|
|
|
|
|
- AuthIdentity:第三方身份绑定
|
|
|
|
|
- SysRole / SysMenu:角色与菜单
|
|
|
|
|
- DTO与参数
|
|
|
|
|
- LoginResultDTO:登录返回结果,已添加@Schema注解
|
|
|
|
|
- UserInfoDTO:用户信息返回,已添加@Schema注解
|
|
|
|
|
- ResourceNode:权限资源节点,已添加@Schema注解
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
|
|
|
|
|
## 架构总览
|
|
|
|
|
认证流程采用"控制器 -> 服务 -> 安全组件"的分层设计。登录成功后由TokenService签发JWT;后续请求通过JwtAuthenticationFilter进行无状态鉴权;权限控制通过注解与拦截器组合实现。
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant C as "客户端"
|
|
|
|
|
participant AC as "AuthController"
|
|
|
|
|
participant RC as "ResourceController"
|
|
|
|
|
participant SVC as "IAuthService"
|
|
|
|
|
participant TS as "TokenService"
|
|
|
|
|
participant JF as "JwtAuthenticationFilter"
|
|
|
|
|
participant DB as "数据库"
|
|
|
|
|
C->>AC : "POST /api/auth/login/dingtalk?authCode={code}"
|
|
|
|
|
AC->>SVC : "login(DINGTALK, authCode)"
|
|
|
|
|
SVC->>DB : "查询用户与密码校验"
|
|
|
|
|
DB-->>SVC : "用户信息/角色/菜单"
|
|
|
|
|
SVC-->>AC : "认证通过"
|
|
|
|
|
AC->>TS : "签发JWT"
|
|
|
|
|
TS-->>AC : "返回token"
|
|
|
|
|
AC-->>C : "登录成功{token, expires}"
|
|
|
|
|
C->>AC : "GET /api/auth/me (携带Authorization : Bearer {token})"
|
|
|
|
|
AC->>JF : "解析JWT并构建认证上下文"
|
|
|
|
|
JF-->>AC : "认证成功"
|
|
|
|
|
AC->>SVC : "获取当前用户信息"
|
|
|
|
|
SVC-->>AC : "UserInfoDTO"
|
|
|
|
|
AC-->>C : "用户信息"
|
|
|
|
|
C->>RC : "GET /api/resources/list (管理员权限)"
|
|
|
|
|
RC->>SVC : "获取权限资源树"
|
|
|
|
|
SVC-->>RC : "ResourceNode列表"
|
|
|
|
|
RC-->>C : "权限资源树"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.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)
|
|
|
|
|
|
|
|
|
|
## 详细组件分析
|
|
|
|
|
|
|
|
|
|
### 认证接口(登录相关)
|
|
|
|
|
认证接口已添加完整的OpenAPI注解,支持Swagger文档自动生成。
|
|
|
|
|
|
|
|
|
|
#### 钉钉扫码登录接口
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- POST /api/auth/login/dingtalk
|
|
|
|
|
- **请求参数**
|
|
|
|
|
- authCode: 钉钉授权码(必填,查询参数)
|
|
|
|
|
- **响应体**
|
|
|
|
|
- 字段参考:LoginResultDTO(包含token和用户信息)
|
|
|
|
|
- **状态码**
|
|
|
|
|
- 200:登录成功
|
|
|
|
|
- 400/401/403/404/500:根据错误类型返回(由全局异常处理器统一封装)
|
|
|
|
|
- **OpenAPI注解**
|
|
|
|
|
- @Operation(summary = "钉钉登录(扫码/免登通用)", tags = "登录")
|
|
|
|
|
- @Tag(name = "认证")
|
|
|
|
|
- **说明**
|
|
|
|
|
- 支持二维码登录和OAuth重定向两种流程,使用相同的底层认证机制
|
|
|
|
|
- 成功时返回JWT令牌及有效期
|
|
|
|
|
- 失败时返回统一错误码与消息
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [AuthController.java:30-34](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L30-L34)
|
|
|
|
|
- [LoginResultDTO.java:18-22](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java#L18-L22)
|
|
|
|
|
|
|
|
|
|
#### 登出接口
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- POST /api/auth/logout
|
|
|
|
|
- **请求头**
|
|
|
|
|
- Authorization: Bearer {jwt}
|
|
|
|
|
- **响应体**
|
|
|
|
|
- 统一结果封装(Result<Void>)
|
|
|
|
|
- **状态码**
|
|
|
|
|
- 200:登出成功
|
|
|
|
|
- 401/500:未认证或服务器错误
|
|
|
|
|
- **OpenAPI注解**
|
|
|
|
|
- @Operation(summary = "注销", tags = "登录")
|
|
|
|
|
- **说明**
|
|
|
|
|
- 若采用无状态JWT,登出通常为前端清除本地token;如需服务端黑名单,请结合缓存实现
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [AuthController.java:36-41](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L36-L41)
|
|
|
|
|
|
|
|
|
|
#### 获取当前用户信息
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- GET /api/auth/me
|
|
|
|
|
- **请求头**
|
|
|
|
|
- Authorization: Bearer {jwt}
|
|
|
|
|
- **响应体**
|
|
|
|
|
- 字段参考:UserInfoDTO(包含用户基本信息和菜单树)
|
|
|
|
|
- **状态码**
|
|
|
|
|
- 200:成功
|
|
|
|
|
- 401:未认证或token无效
|
|
|
|
|
- 500:服务器错误
|
|
|
|
|
- **OpenAPI注解**
|
|
|
|
|
- @Operation(summary = "获取当前登录用户信息", tags = "登录")
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [AuthController.java:43-47](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L43-L47)
|
|
|
|
|
- [UserInfoDTO.java:18-40](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java#L18-L40)
|
|
|
|
|
|
|
|
|
|
### 权限资源管理接口
|
|
|
|
|
权限资源管理接口已添加完整的OpenAPI注解,支持Swagger文档自动生成。
|
|
|
|
|
|
|
|
|
|
#### 获取权限资源树
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- GET /api/resources/list
|
|
|
|
|
- **权限要求**
|
|
|
|
|
- 需要ADMIN角色权限(@PreAuthorize("hasRole('ADMIN')"))
|
|
|
|
|
- **响应体**
|
|
|
|
|
- List<ResourceNode>:权限资源树节点列表
|
|
|
|
|
- **状态码**
|
|
|
|
|
- 200:成功
|
|
|
|
|
- 403:权限不足
|
|
|
|
|
- **OpenAPI注解**
|
|
|
|
|
- @Operation(summary = "获取权限资源树", tags = "权限点管理")
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [ResourceController.java:28-32](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java#L28-L32)
|
|
|
|
|
- [ResourceNode.java:23-60](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java#L23-L60)
|
|
|
|
|
|
|
|
|
|
#### 新增编辑权限节点
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- POST /api/resources/saveOrUpdate
|
|
|
|
|
- **权限要求**
|
|
|
|
|
- 需要ADMIN角色权限
|
|
|
|
|
- **请求体**
|
|
|
|
|
- ResourceNode对象(包含id、parentId、name、type、sort、description、route、perms、denyBehavior、apiUrl、status、icon等字段)
|
|
|
|
|
- **响应体**
|
|
|
|
|
- ResourceNode:保存后的节点信息
|
|
|
|
|
- **状态码**
|
|
|
|
|
- 200:成功
|
|
|
|
|
- 400:参数校验失败
|
|
|
|
|
- 403:权限不足
|
|
|
|
|
- **OpenAPI注解**
|
|
|
|
|
- @Operation(summary = "新增编辑一级菜单/二级菜单/权限点", tags = "权限点管理")
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [ResourceController.java:35-39](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java#L35-L39)
|
|
|
|
|
- [ResourceNode.java:23-57](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java#L23-L57)
|
|
|
|
|
|
|
|
|
|
#### 删除权限节点
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- POST /api/resources/delete
|
|
|
|
|
- **权限要求**
|
|
|
|
|
- 需要ADMIN角色权限
|
|
|
|
|
- **请求参数**
|
|
|
|
|
- id: 要删除的节点ID(必填)
|
|
|
|
|
- **响应体**
|
|
|
|
|
- 空响应体
|
|
|
|
|
- **状态码**
|
|
|
|
|
- 200:成功
|
|
|
|
|
- 400:参数校验失败
|
|
|
|
|
- 403:权限不足
|
|
|
|
|
- **OpenAPI注解**
|
|
|
|
|
- @Operation(summary = "删除一级菜单/二级菜单/权限点", tags = "权限点管理")
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [ResourceController.java:42-47](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java#L42-L47)
|
|
|
|
|
|
|
|
|
|
#### 上传图标
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- POST /api/resources/icon/upload
|
|
|
|
|
- **权限要求**
|
|
|
|
|
- 需要ADMIN角色权限
|
|
|
|
|
- **请求参数**
|
|
|
|
|
- file: 文件上传(multipart/form-data)
|
|
|
|
|
- **响应体**
|
|
|
|
|
- FileInfoDTO:文件信息
|
|
|
|
|
- **状态码**
|
|
|
|
|
- 200:成功
|
|
|
|
|
- 400:文件格式或大小校验失败
|
|
|
|
|
- 403:权限不足
|
|
|
|
|
- **OpenAPI注解**
|
|
|
|
|
- @Operation(summary = "上传图标", tags = "权限点管理")
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [ResourceController.java:50-54](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java#L50-L54)
|
|
|
|
|
|
|
|
|
|
### 系统管理接口
|
|
|
|
|
系统管理接口提供用户、部门、菜单等系统级功能。
|
|
|
|
|
|
|
|
|
|
#### 获取菜单树
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- GET /api/system/menus/tree
|
|
|
|
|
- **响应体**
|
|
|
|
|
- List<SysMenu>:当前用户可见的菜单树
|
|
|
|
|
- **说明**
|
|
|
|
|
- 根据用户权限动态返回可见菜单
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [SystemController.java:35-39](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java#L35-L39)
|
|
|
|
|
|
|
|
|
|
#### 获取部门树
|
|
|
|
|
- **HTTP方法与路径**
|
|
|
|
|
- GET /api/system/depts/tree
|
|
|
|
|
- **响应体**
|
|
|
|
|
- List<SysDept>:部门树结构
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [SystemController.java:43-49](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java#L43-L49)
|
|
|
|
|
|
|
|
|
|
## 依赖关系分析
|
|
|
|
|
```mermaid
|
|
|
|
|
classDiagram
|
|
|
|
|
class AuthController {
|
|
|
|
|
+loginByDingTalk(authCode)
|
|
|
|
|
+logout()
|
|
|
|
|
+me()
|
|
|
|
|
}
|
|
|
|
|
class ResourceController {
|
|
|
|
|
+listAll()
|
|
|
|
|
+saveOrUpdate(node)
|
|
|
|
|
+delete(id)
|
|
|
|
|
+uploadIcon(file)
|
|
|
|
|
}
|
|
|
|
|
class SystemController {
|
|
|
|
|
+menuTree()
|
|
|
|
|
+deptTree()
|
|
|
|
|
+assignUserRoles(userId, roleIds)
|
|
|
|
|
+assignUserDepts(userId, primaryDeptId, deptIds)
|
|
|
|
|
+userPage(param)
|
|
|
|
|
+userStats(deptId)
|
|
|
|
|
}
|
|
|
|
|
class IAuthService {
|
|
|
|
|
+login(type, authCode)
|
|
|
|
|
+logout(token)
|
|
|
|
|
+getCurrentUserInfo()
|
|
|
|
|
}
|
|
|
|
|
class AuthServiceImpl
|
|
|
|
|
class TokenService {
|
|
|
|
|
+createToken()
|
|
|
|
|
+validateToken()
|
|
|
|
|
+refreshToken()
|
|
|
|
|
}
|
|
|
|
|
class JwtAuthenticationFilter {
|
|
|
|
|
+doFilter()
|
|
|
|
|
}
|
|
|
|
|
class DingTalkAuthClient {
|
|
|
|
|
+getUserInfo(authCode)
|
|
|
|
|
}
|
|
|
|
|
class ThirdPartyAuthClientFactory {
|
|
|
|
|
+getClient()
|
|
|
|
|
}
|
|
|
|
|
class LoginResultDTO {
|
|
|
|
|
+token
|
|
|
|
|
+userInfo
|
|
|
|
|
}
|
|
|
|
|
class UserInfoDTO {
|
|
|
|
|
+id
|
|
|
|
|
+username
|
|
|
|
|
+mobile
|
|
|
|
|
+email
|
|
|
|
|
+avatar
|
|
|
|
|
+deptId
|
|
|
|
|
+deptName
|
|
|
|
|
+menus
|
|
|
|
|
}
|
|
|
|
|
class ResourceNode {
|
|
|
|
|
+id
|
|
|
|
|
+parentId
|
|
|
|
|
+name
|
|
|
|
|
+type
|
|
|
|
|
+sort
|
|
|
|
|
+description
|
|
|
|
|
+route
|
|
|
|
|
+perms
|
|
|
|
|
+denyBehavior
|
|
|
|
|
+apiUrl
|
|
|
|
|
+status
|
|
|
|
|
+icon
|
|
|
|
|
+children
|
|
|
|
|
}
|
|
|
|
|
AuthController --> IAuthService : "调用"
|
|
|
|
|
ResourceController --> IAuthService : "调用"
|
|
|
|
|
AuthServiceImpl ..|> IAuthService : "实现"
|
|
|
|
|
AuthController --> TokenService : "签发/校验"
|
|
|
|
|
JwtAuthenticationFilter --> TokenService : "解析/校验"
|
|
|
|
|
AuthController --> DingTalkAuthClient : "第三方登录"
|
|
|
|
|
DingTalkAuthClient <|-- ThirdPartyAuthClientFactory : "工厂创建"
|
|
|
|
|
IAuthService --> LoginResultDTO : "返回"
|
|
|
|
|
IAuthService --> UserInfoDTO : "返回"
|
|
|
|
|
ResourceController --> ResourceNode : "操作"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [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)
|
|
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
|
|
|
|
|
## 性能考虑
|
|
|
|
|
- JWT无状态鉴权减少会话存储压力,适合水平扩展
|
|
|
|
|
- 建议对敏感接口启用限流与防重放
|
|
|
|
|
- 第三方登录需设置合理的超时与重试策略
|
|
|
|
|
- 用户信息与权限可缓存(如Redis),降低数据库压力
|
|
|
|
|
- 分页与懒加载菜单/权限,避免一次性加载过多数据
|
|
|
|
|
- 权限资源树可缓存,减少频繁查询
|
|
|
|
|
|
|
|
|
|
## 故障排查指南
|
|
|
|
|
- 常见错误
|
|
|
|
|
- 401 未认证:检查Authorization头是否携带有效JWT
|
|
|
|
|
- 403 权限不足:检查用户角色与菜单权限
|
|
|
|
|
- 400 参数错误:检查请求参数是否符合接口定义(authCode不能为空)
|
|
|
|
|
- 500 服务器错误:查看日志定位服务异常
|
|
|
|
|
- 调试建议
|
|
|
|
|
- 开启调试日志,关注JwtAuthenticationFilter与TokenService的解析与校验过程
|
|
|
|
|
- 第三方登录失败时,检查回调地址、AppKey/Secret与网络连通性
|
|
|
|
|
- 使用统一结果封装Result与ResultCodeEnum快速定位错误码
|
|
|
|
|
- 利用Swagger文档验证接口参数和响应格式
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
|
|
|
|
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
|
|
|
|
|
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.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)
|
|
|
|
|
|
|
|
|
|
## 结论
|
|
|
|
|
认证模块采用分层清晰、职责明确的架构,结合JWT无状态鉴权与灵活的第三方登录扩展,满足企业级应用的安全与可扩展需求。通过统一的异常处理与结果封装,提升了接口的稳定性与可维护性。最新的OpenAPI注解增强提供了更好的API文档体验,支持Swagger自动生成接口文档。建议在生产环境完善密钥管理、审计日志与监控告警,确保整体安全性与可靠性。
|
|
|
|
|
|
|
|
|
|
## 附录
|
|
|
|
|
|
|
|
|
|
### OpenAPI/Swagger文档集成
|
|
|
|
|
- **注解使用**
|
|
|
|
|
- @Tag:为接口分组命名(如"认证"、"权限点管理")
|
|
|
|
|
- @Operation:为接口添加描述和标签
|
|
|
|
|
- @Schema:为DTO字段添加描述信息
|
|
|
|
|
- **文档访问**
|
|
|
|
|
- Swagger UI:http://localhost:端口/swagger-ui.html
|
|
|
|
|
- OpenAPI规范:http://localhost:端口/v3/api-docs
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [AuthController.java:22-47](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L22-L47)
|
|
|
|
|
- [ResourceController.java:28-54](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java#L28-L54)
|
|
|
|
|
- [LoginResultDTO.java:18-22](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java#L18-L22)
|
|
|
|
|
- [UserInfoDTO.java:18-40](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java#L18-L40)
|
|
|
|
|
- [ResourceNode.java:23-60](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java#L23-L60)
|
|
|
|
|
|
|
|
|
|
### 安全最佳实践
|
|
|
|
|
- 密码加密策略
|
|
|
|
|
- 使用强哈希算法(如BCrypt)存储密码,禁止明文存储
|
|
|
|
|
- 定期轮换盐值与算法版本
|
|
|
|
|
- 会话管理
|
|
|
|
|
- 优先采用无状态JWT;如需强制下线,引入黑名单或短期令牌+刷新令牌机制
|
|
|
|
|
- 合理设置JWT过期时间,避免过长
|
|
|
|
|
- 传输安全
|
|
|
|
|
- 全站HTTPS,启用HSTS
|
|
|
|
|
- 严格校验CORS与CSRF防护
|
|
|
|
|
- 第三方登录
|
|
|
|
|
- 校验state参数防CSRF
|
|
|
|
|
- 最小化权限范围,及时撤销不再使用的授权
|
|
|
|
|
- 审计与监控
|
|
|
|
|
- 记录登录、登出、授权失败等关键事件
|
|
|
|
|
- 对异常IP与高频请求进行告警与封禁
|
|
|
|
|
|
|
|
|
|
### 第三方平台(钉钉)集成配置与使用示例
|
|
|
|
|
- 配置项
|
|
|
|
|
- AppKey、AppSecret、回调地址、域名白名单等(参考AuthProperties)
|
|
|
|
|
- 流程
|
|
|
|
|
- 前端跳转至钉钉授权页,获取授权码
|
|
|
|
|
- 后端使用授权码调用钉钉API换取用户信息
|
|
|
|
|
- 绑定或创建本地用户,签发JWT
|
|
|
|
|
- 使用示例
|
|
|
|
|
- **简化后的请求**:POST /api/auth/login/dingtalk?authCode={授权码}
|
|
|
|
|
- 响应:成功返回LoginResultDTO(含token与过期时间)
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.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)
|
|
|
|
|
- [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java)
|
|
|
|
|
|
|
|
|
|
### 请求与响应示例(成功与失败)
|
|
|
|
|
- 钉钉扫码登录成功
|
|
|
|
|
- 请求:POST /api/auth/login/dingtalk?authCode=abc123
|
|
|
|
|
- 响应:200,包含token与expires
|
|
|
|
|
- 钉钉扫码登录失败
|
|
|
|
|
- 请求:POST /api/auth/login/dingtalk?authCode=invalid_code
|
|
|
|
|
- 响应:400或401,包含错误码与消息
|
|
|
|
|
- 获取用户信息成功
|
|
|
|
|
- 请求:GET /api/auth/me,Header携带Authorization
|
|
|
|
|
- 响应:200,包含用户基本信息与角色/菜单
|
|
|
|
|
- 登出成功
|
|
|
|
|
- 请求:POST /api/auth/logout,Header携带Authorization
|
|
|
|
|
- 响应:200,空响应体
|
|
|
|
|
- 获取权限资源树成功
|
|
|
|
|
- 请求:GET /api/resources/list(需要ADMIN权限)
|
|
|
|
|
- 响应:200,包含ResourceNode列表
|
|
|
|
|
- 新增权限节点成功
|
|
|
|
|
- 请求:POST /api/resources/saveOrUpdate,Body包含ResourceNode
|
|
|
|
|
- 响应:200,包含保存后的节点信息
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.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)
|
|
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
- [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
|
|
|
|
- [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java)
|
|
|
|
|
- [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java)
|