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.

528 lines
26 KiB

1 month ago
# 用户认证模型
<cite>
**本文引用的文件**
- [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)
- [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)
- [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java)
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
- [AuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java)
- [AuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java)
- [IAuthIdentityService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthIdentityService.java)
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
- [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)
- [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)
- [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)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件聚焦于用户认证数据模型,围绕 AuthUser、AuthIdentity 等核心实体进行系统化说明,涵盖字段定义、数据类型与业务含义;阐述用户身份验证机制、多身份支持、登录结果数据结构;解释用户状态管理、密码加密存储、第三方身份集成;并提供实体关系图、字段约束与默认值设置;最后总结用户信息 DTO 的设计模式与数据传输规范,为开发者提供完整的用户认证数据模型参考。
## 项目结构
认证相关代码主要位于 crm-auth 模块,采用分层架构:
- controller:对外暴露认证接口
- service:业务逻辑层(认证、用户、身份)
- domain:领域对象(entity、dto、param、enums)
- security:安全配置与令牌处理
- config:安全与初始化配置
- mapper:数据访问映射
```mermaid
graph TB
subgraph "crm-auth"
C["controller<br/>AuthController"] --> S["service<br/>AuthServiceImpl / IAuthService"]
S --> SU["service<br/>AuthUserServiceImpl / IAuthUserService"]
S --> SI["service<br/>AuthIdentityServiceImpl / IAuthIdentityService"]
S --> T["security<br/>TokenService"]
S --> D["domain/entity<br/>AuthUser / AuthIdentity"]
S --> E["domain/enums<br/>IdentityTypeEnum"]
S --> F["service/client<br/>ThirdPartyAuthClient / DingTalkAuthClient"]
C --> P["domain/param<br/>LoginParam"]
S --> R["domain/dto<br/>LoginResultDTO / UserInfoDTO"]
end
subgraph "crm-base"
B["domain/entity<br/>BaseEntity"]
ST["domain/enums<br/>StatusEnum"]
end
D --> B
D --> ST
```
**图表来源**
- [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)
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.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)
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.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)
- [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)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
**章节来源**
- [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)
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [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)
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
## 核心组件
- AuthUser:用户主实体,承载用户基本信息、状态、时间戳等,继承基础实体以统一审计字段。
- AuthIdentity:用户身份记录,用于支撑多身份(如手机号、邮箱、第三方平台账号),通过类型枚举区分不同身份源。
- LoginParam:登录请求参数,包含用户名/标识与凭证等。
- LoginResultDTO:登录响应数据,包含令牌、用户信息与权限摘要。
- UserInfoDTO:用户信息传输对象,面向前端展示与跨服务传输。
- IdentityTypeEnum:身份类型枚举,定义系统内支持的各类身份来源。
- TokenService:令牌生成与校验,负责 JWT 生命周期管理。
- ThirdPartyAuthClient 系列:第三方身份客户端抽象与工厂,支持钉钉等外部身份提供商。
**章节来源**
- [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)
- [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)
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.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)
## 架构总览
认证流程从控制器进入,经服务层完成用户校验、身份匹配、令牌签发,并可选地对接第三方身份提供商。JWT 过滤器在后续请求中完成鉴权上下文构建。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Controller as "AuthController"
participant Service as "AuthServiceImpl"
participant UserSvc as "AuthUserServiceImpl"
participant IdSvc as "AuthIdentityServiceImpl"
participant Token as "TokenService"
participant Third as "ThirdPartyAuthClient"
Client->>Controller : "提交登录参数(LoginParam)"
Controller->>Service : "调用登录接口"
Service->>UserSvc : "根据标识查询用户"
UserSvc-->>Service : "返回用户实体(AuthUser)"
Service->>IdSvc : "校验身份凭证(含第三方)"
IdSvc-->>Service : "返回身份校验结果"
Service->>Third : "若为第三方则获取外部用户信息"
Third-->>Service : "返回第三方用户信息"
Service->>Token : "生成访问令牌"
Token-->>Service : "返回令牌"
Service-->>Controller : "组装登录结果(LoginResultDTO)"
Controller-->>Client : "返回登录结果"
```
**图表来源**
- [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)
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java)
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
## 详细组件分析
### 实体:AuthUser(用户主实体)
- 继承基础实体 BaseEntity,获得统一的审计字段(如创建/更新时间、创建人等)。
- 关键字段建议包括:
- 用户标识:唯一主键
- 用户名/显示名:用于展示与检索
- 状态:使用 StatusEnum 表示启用/禁用等
- 密码:加密存储,禁止明文
- 扩展字段:头像、联系方式、部门/角色关联ID等
- 业务含义:代表系统内的一个用户主体,作为登录与授权的核心。
```mermaid
classDiagram
class BaseEntity {
+id
+createTime
+updateTime
+createBy
+updateBy
}
class AuthUser {
+userId
+username
+displayName
+status
+password
+avatar
+contact
+deptId
+roleId
+isActive()
+getProfile()
}
class StatusEnum {
+ACTIVE
+DISABLED
}
AuthUser --|> BaseEntity : "继承"
AuthUser --> StatusEnum : "使用"
```
**图表来源**
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
**章节来源**
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
### 实体:AuthIdentity(用户身份记录)
- 用于支撑多身份:同一用户可绑定多个身份(如手机号、邮箱、第三方平台账号)。
- 关键字段建议包括:
- 身份标识:唯一主键
- 用户ID:外键关联到 AuthUser
- 身份类型:IdentityTypeEnum(如 phone、email、dingtalk 等)
- 身份值:具体标识(如手机号、邮箱地址、第三方 openId)
- 是否默认:标记该身份是否为登录首选
- 状态:启用/禁用
- 业务含义:解耦用户与具体登录标识,支持灵活的身份管理与扩展。
```mermaid
classDiagram
class AuthIdentity {
+identityId
+userId
+identityType
+identityValue
+isDefault
+status
+validate()
+bindToUser(userId)
}
class IdentityTypeEnum {
+PHONE
+EMAIL
+DINGTALK
+OTHER
}
AuthIdentity --> IdentityTypeEnum : "使用"
```
**图表来源**
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
**章节来源**
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
### 登录参数与结果:LoginParam、LoginResultDTO、UserInfoDTO
- LoginParam:登录请求体,包含身份标识与凭证(如用户名/手机号与密码或第三方授权码)。
- LoginResultDTO:登录响应体,包含访问令牌、刷新令牌(可选)、用户信息摘要、权限集合等。
- UserInfoDTO:用户信息传输对象,屏蔽敏感字段(如密码),仅暴露必要展示字段。
```mermaid
classDiagram
class LoginParam {
+identity
+credential
+provider
}
class LoginResultDTO {
+accessToken
+refreshToken
+expiresIn
+userInfo
+permissions
}
class UserInfoDTO {
+userId
+username
+displayName
+avatar
+roles
+departments
}
LoginResultDTO --> UserInfoDTO : "包含"
```
**图表来源**
- [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)
**章节来源**
- [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)
### 用户状态管理与密码加密存储
- 用户状态:通过 StatusEnum 控制启用/禁用,服务层在登录时检查状态,禁用用户拒绝登录。
- 密码加密:密码字段必须使用强哈希算法(如 BCrypt)存储,禁止明文;登录时比对哈希值而非明文。
- 默认值与约束:
- 状态默认启用
- 用户名唯一
- 身份值唯一(按类型+值组合)
- 必填字段校验(用户名、密码、身份值)
```mermaid
flowchart TD
Start(["登录入口"]) --> CheckStatus["检查用户状态"]
CheckStatus --> StatusOK{"状态有效?"}
StatusOK --> |否| Deny["拒绝登录(状态异常)"]
StatusOK --> |是| VerifyPwd["校验密码(哈希比对)"]
VerifyPwd --> PwdOK{"密码正确?"}
PwdOK --> |否| Deny
PwdOK --> |是| IssueToken["签发令牌(TokenService)"]
IssueToken --> Return["返回登录结果(LoginResultDTO)"]
```
**图表来源**
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
**章节来源**
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
- [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java)
### 多身份支持与第三方身份集成
- 多身份:AuthIdentity 通过 identityType 区分不同来源,支持同一用户绑定多个身份;登录时根据 identity 查找对应身份记录,再关联用户。
- 第三方集成:ThirdPartyAuthClient 抽象统一接口,DingTalkAuthClient 实现钉钉登录;ThirdPartyAuthClientFactory 根据 provider 选择具体客户端。
- 第三方用户信息:ThirdPartyUserInfo 封装外部平台返回的用户属性,映射到系统用户与身份记录。
```mermaid
classDiagram
class ThirdPartyAuthClient {
+authenticate(provider, code) ThirdPartyUserInfo
+getUserInfo(openId) ThirdPartyUserInfo
}
class DingTalkAuthClient {
+authenticate(provider, code) ThirdPartyUserInfo
+getUserInfo(openId) ThirdPartyUserInfo
}
class ThirdPartyAuthClientFactory {
+getClient(provider) ThirdPartyAuthClient
}
class ThirdPartyUserInfo {
+openId
+nickname
+avatar
+email
+phone
}
ThirdPartyAuthClient <|-- DingTalkAuthClient : "实现"
ThirdPartyAuthClientFactory --> ThirdPartyAuthClient : "创建"
ThirdPartyAuthClient --> ThirdPartyUserInfo : "返回"
```
**图表来源**
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.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)
**章节来源**
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.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)
### 登录流程序列图(含第三方)
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Controller as "AuthController"
participant Service as "AuthServiceImpl"
participant IdSvc as "AuthIdentityServiceImpl"
participant Third as "DingTalkAuthClient"
participant Token as "TokenService"
Client->>Controller : "POST /auth/login (LoginParam)"
Controller->>Service : "login(param)"
Service->>IdSvc : "resolveIdentity(identity, provider)"
alt "第三方登录"
Service->>Third : "authenticate(provider, code)"
Third-->>Service : "ThirdPartyUserInfo"
Service->>IdSvc : "bindOrFindIdentity(userInfo)"
else "本地登录"
Service->>IdSvc : "verifyLocalCredential(identity, credential)"
end
Service->>Token : "generateToken(user)"
Token-->>Service : "accessToken"
Service-->>Controller : "LoginResultDTO"
Controller-->>Client : "200 OK"
```
**图表来源**
- [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)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.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)
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
### 实体关系图(ER)
```mermaid
erDiagram
AUTH_USER {
bigint id PK
string username UK
string display_name
enum status
string password
string avatar
string contact
bigint dept_id
bigint role_id
timestamp created_at
timestamp updated_at
}
AUTH_IDENTITY {
bigint id PK
bigint user_id FK
enum identity_type
string identity_value UK
boolean is_default
enum status
timestamp created_at
timestamp updated_at
}
AUTH_USER ||--o{ AUTH_IDENTITY : "拥有多个身份"
```
**图表来源**
- [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)
**章节来源**
- [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)
## 依赖关系分析
- 控制器依赖服务层,服务层依赖用户与身份服务,以及令牌服务与第三方客户端。
- 实体依赖基础实体与枚举,保证审计与状态一致性。
- 第三方客户端通过工厂按需实例化,避免耦合具体提供商。
```mermaid
graph LR
AC["AuthController"] --> AS["AuthServiceImpl"]
AS --> AUS["AuthUserServiceImpl"]
AS --> AIS["AuthIdentityServiceImpl"]
AS --> TS["TokenService"]
AS --> TP["ThirdPartyAuthClient"]
TP --> DT["DingTalkAuthClient"]
TP --> TF["ThirdPartyAuthClientFactory"]
AU["AuthUser"] --> BE["BaseEntity"]
AI["AuthIdentity"] --> IT["IdentityTypeEnum"]
```
**图表来源**
- [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)
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.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)
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
**章节来源**
- [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)
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.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)
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
## 性能考虑
- 令牌签发与校验:TokenService 应缓存密钥与配置,减少重复计算;JWT 体积适中,避免携带过多用户信息。
- 身份查询:AuthIdentity 的 identity_type + identity_value 建立复合索引,提升多身份检索效率。
- 第三方调用:对第三方 API 增加超时与重试策略,必要时引入缓存与降级。
- 密码校验:BCrypt 开销较大,建议在并发场景下合理限制并发度与连接池大小。
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 登录失败常见原因:
- 用户状态禁用:检查 StatusEnum 与用户状态字段
- 密码错误:确认密码哈希是否正确更新
- 身份不存在或冲突:检查 AuthIdentity 的唯一性约束
- 第三方回调异常:核对 provider、code、openId 映射
- 调试建议:
- 打印登录参数与解析结果
- 查看令牌生成与校验日志
- 检查第三方客户端返回结构与字段映射
**章节来源**
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
## 结论
本模型通过 AuthUser 与 AuthIdentity 的解耦设计,实现了用户与身份的灵活绑定与多身份支持;结合 TokenService 与第三方客户端抽象,构建了可扩展的认证体系。遵循 DTO 最小暴露原则与枚举化状态管理,确保数据安全与可维护性。建议在生产环境完善索引、缓存与监控,保障认证性能与稳定性。
[本节为总结性内容,不直接分析具体文件]
## 附录
- 字段约束与默认值建议:
- 用户名唯一、非空
- 身份值按类型唯一
- 状态默认启用
- 时间戳由基础实体自动填充
- 数据传输规范:
- LoginParam 仅包含必要登录字段
- LoginResultDTO 不包含敏感信息(如密码)
- UserInfoDTO 仅暴露展示所需字段
[本节为补充说明,不直接分析具体文件]