169 lines
6.9 KiB
Markdown
169 lines
6.9 KiB
Markdown
# Salesforce 策略模式登录数据库结构说明
|
||
|
||
## 元数据
|
||
- 需求编号:2026-01-21-003-02
|
||
- 创建时间:2026-01-22
|
||
- 创建人:SSOT 架构师
|
||
- 状态:已完成
|
||
|
||
## 数据库概述
|
||
Salesforce 策略模式登录功能不需要创建新的数据库表,登录信息会回写到已有的 `datai_sf_system_config` 表中(在子需求 2026-01-21-003-01 中已创建)。
|
||
|
||
## 已有表结构
|
||
|
||
### datai_sf_system_config(Salesforce 系统配置表)
|
||
|
||
该表已在子需求 2026-01-21-003-01 中创建,包含以下字段:
|
||
|
||
| 字段名 | 类型 | 说明 | 登录功能使用 |
|
||
| ------ | ---- | ---- | ---- |
|
||
| id | BIGINT(20) | 主键ID | - |
|
||
| system_name | VARCHAR(100) | 系统名称(唯一) | 用于读取系统配置 |
|
||
| system_type | VARCHAR(50) | 系统类型(用户自定义) | - |
|
||
| org_type | CHAR(1) | 组织类型(S=源 org T=目标 org) | - |
|
||
| login_type | VARCHAR(20) | 登录类型(oauth2/session_id/cli) | 用于选择登录策略 |
|
||
| client_id | VARCHAR(255) | OAuth 客户端 ID | OAuth2 登录使用 |
|
||
| client_secret | VARCHAR(500) | OAuth 客户端密钥(加密存储) | OAuth2 登录使用 |
|
||
| username | VARCHAR(100) | 用户名 | OAuth2 Password 登录使用 |
|
||
| password | VARCHAR(500) | 密码(加密存储) | OAuth2 Password 登录使用 |
|
||
| security_token | VARCHAR(500) | 安全令牌(加密存储) | OAuth2 Password 登录使用 |
|
||
| session_id | VARCHAR(255) | Session ID(Access Token) | 登录成功后回写 |
|
||
| server_url | VARCHAR(500) | 服务器 URL(Instance URL) | 登录成功后回写 |
|
||
| access_token | VARCHAR(255) | 访问令牌(Session ID) | 登录成功后回写 |
|
||
| refresh_token | VARCHAR(255) | 刷新令牌 | OAuth2 登录成功后回写 |
|
||
| token_expires_at | DATETIME | 令牌过期时间 | OAuth2 登录成功后回写 |
|
||
| sf_user_id | VARCHAR(100) | Salesforce 用户 ID(用于缓存键) | 登录成功后回写 |
|
||
| user_id | VARCHAR(100) | 用户 ID | 登录成功后回写 |
|
||
| org_id | VARCHAR(100) | 组织 ID | 登录成功后回写 |
|
||
| org_name | VARCHAR(255) | 组织名称 | 登录成功后回写 |
|
||
| status | CHAR(1) | 状态(0正常 1停用) | - |
|
||
| sort_order | INT(11) | 排序 | - |
|
||
| remark | VARCHAR(500) | 备注 | - |
|
||
| create_by | VARCHAR(64) | 创建者 | - |
|
||
| create_time | DATETIME | 创建时间 | - |
|
||
| update_by | VARCHAR(64) | 更新者 | - |
|
||
| update_time | DATETIME | 更新时间 | - |
|
||
|
||
## 数据流说明
|
||
|
||
### 登录流程数据流
|
||
```
|
||
登录流程数据流
|
||
├─ 1. 读取系统配置
|
||
│ └─ 从 datai_sf_system_config 表读取配置
|
||
│ ├─ 根据 system_name 查询配置
|
||
│ ├─ 获取 client_id、client_secret、username、password、security_token
|
||
│ └─ 使用 EncryptUtils 解密敏感信息
|
||
├─ 2. 执行登录
|
||
│ ├─ OAuth2 Password 登录
|
||
│ │ ├─ 调用 Salesforce OAuth2 API
|
||
│ │ ├─ 获取 access_token、refresh_token、instance_url、expires_at
|
||
│ │ └─ 调用 Identity API 获取用户信息
|
||
│ ├─ OAuth2 Client Credentials 登录
|
||
│ │ ├─ 调用 Salesforce OAuth2 API
|
||
│ │ ├─ 获取 access_token、refresh_token、instance_url、expires_at
|
||
│ │ └─ 调用 Identity API 获取用户信息
|
||
│ ├─ OAuth2 Authorization Code 登录
|
||
│ │ ├─ 调用 Salesforce OAuth2 API
|
||
│ │ ├─ 获取 access_token、refresh_token、instance_url、expires_at
|
||
│ │ └─ 调用 Identity API 获取用户信息
|
||
│ └─ Session ID 登录
|
||
│ ├─ 使用已有的 session_id 和 server_url
|
||
│ └─ 调用 Identity API 验证并获取用户信息
|
||
└─ 3. 回写登录信息
|
||
└─ 更新 datai_sf_system_config 表
|
||
├─ session_id: 访问令牌
|
||
├─ server_url: 实例 URL
|
||
├─ access_token: 访问令牌
|
||
├─ refresh_token: 刷新令牌(仅 OAuth2 登录)
|
||
├─ token_expires_at: 过期时间(仅 OAuth2 登录)
|
||
├─ sf_user_id: 用户 ID
|
||
├─ user_id: 用户名
|
||
├─ org_id: 组织 ID
|
||
├─ org_name: 组织名称
|
||
└─ update_time: 更新时间
|
||
```
|
||
|
||
### 刷新令牌流程数据流
|
||
```
|
||
刷新令牌流程数据流
|
||
├─ 1. 读取系统配置
|
||
│ └─ 从 datai_sf_system_config 表读取配置
|
||
│ ├─ 根据 system_name 查询配置
|
||
│ ├─ 获取 client_id、client_secret、refresh_token
|
||
│ └─ 使用 EncryptUtils 解密敏感信息
|
||
├─ 2. 执行刷新令牌
|
||
│ └─ 调用 Salesforce OAuth2 API
|
||
│ └─ 获取新的 access_token、refresh_token、instance_url、expires_at
|
||
└─ 3. 回写登录信息
|
||
└─ 更新 datai_sf_system_config 表
|
||
├─ session_id: 新的访问令牌
|
||
├─ server_url: 新的实例 URL
|
||
├─ access_token: 新的访问令牌
|
||
├─ refresh_token: 新的刷新令牌
|
||
├─ token_expires_at: 新的过期时间
|
||
└─ update_time: 更新时间
|
||
```
|
||
|
||
### 登出流程数据流
|
||
```
|
||
登出流程数据流
|
||
├─ 1. 读取系统配置
|
||
│ └─ 从 datai_sf_system_config 表读取配置
|
||
│ └─ 根据 system_name 查询配置
|
||
├─ 2. 执行登出
|
||
│ └─ 调用 Salesforce 登出 API
|
||
└─ 3. 清空登录信息
|
||
└─ 更新 datai_sf_system_config 表
|
||
├─ session_id: NULL
|
||
├─ server_url: NULL
|
||
├─ access_token: NULL
|
||
├─ refresh_token: NULL
|
||
├─ token_expires_at: NULL
|
||
└─ update_time: 更新时间
|
||
```
|
||
|
||
## 索引说明
|
||
|
||
### 已有索引
|
||
- 主键索引:`id`
|
||
- 唯一索引:`uk_system_name` (system_name)
|
||
- 普通索引:`idx_system_type` (system_type)
|
||
- 普通索引:`idx_org_type` (org_type)
|
||
- 普通索引:`idx_login_type` (login_type)
|
||
- 普通索引:`idx_status` (status)
|
||
- 普通索引:`idx_sf_user_id` (sf_user_id)
|
||
|
||
### 索引使用场景
|
||
- `uk_system_name`:用于根据系统名称快速查询配置
|
||
- `idx_login_type`:用于根据登录类型快速查询配置
|
||
- `idx_sf_user_id`:用于根据 Salesforce 用户 ID 快速查询配置(后续缓存优化使用)
|
||
|
||
## 数据安全
|
||
|
||
### 敏感信息加密
|
||
以下字段使用 `EncryptUtils` 加密存储:
|
||
- `client_secret`:OAuth 客户端密钥
|
||
- `password`:密码
|
||
- `security_token`:安全令牌
|
||
|
||
### 加密流程
|
||
```
|
||
加密流程
|
||
├─ 存储时
|
||
│ └─ 使用 EncryptUtils.encrypt() 加密敏感信息
|
||
│ └─ 存储加密后的值到数据库
|
||
└─ 读取时
|
||
└─ 使用 EncryptUtils.decrypt() 解密敏感信息
|
||
└─ 获取原始值用于登录
|
||
```
|
||
|
||
## 总结
|
||
Salesforce 策略模式登录功能不需要创建新的数据库表,使用已有的 `datai_sf_system_config` 表存储登录信息。登录成功后,会将 Session ID、Server URL、用户信息、组织信息等回写到该表中。
|
||
|
||
## 相关文档
|
||
- [需求文档](../requirements/2026-01-21-003-02-salesforce-strategy-login.md)
|
||
- [设计文档](../design/2026-01-21-003-02-salesforce-strategy-login-design.md)
|
||
- [架构决策](../decisions/2026-01-21-003-02-ADR-salesforce-strategy-login.md)
|
||
- [系统配置表 SQL](../sql/2026-01-21-003-01-datai_sf_system_config.sql)
|