# 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)