datai/docs/requirements/2026-01-21-003-02-salesforce-strategy-login.md

367 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Salesforce 策略模式登录需求
## 元数据
- 需求编号2026-01-21-003-02
- 父需求编号2026-01-21-003
- 创建时间2026-01-21
- 创建人SSOT 架构师
- 状态:待开始
- 优先级:高
## 需求概述
使用策略模式实现不同类型的 Salesforce 系统登录,用户通过页面选择登录策略。支持 OAuth2 登录策略最简单模式、Session ID 登录策略最简单模式、Salesforce CLI 登录策略、Legacy Credential 登录策略传统账密凭证支持扩展新的登录策略预留接口。OAuth2 登录支持三种授权流程密码流程password、客户端凭证流程client_credentials、授权码流程authorization_code。Session ID 登录使用已有的 Salesforce Session ID 进行登录,通过 Identity API 验证 Session ID 并获取用户信息。Legacy Credential 登录使用 SOAP API 进行传统账密凭证登录。Salesforce CLI 登录通过 Salesforce CLI 命令行工具获取 Session 信息。登录策略工厂使用工厂方法模式进行依赖注入。
## 目标
1. **策略模式实现**:使用策略模式实现不同类型的 Salesforce 系统登录
2. **用户选择策略**:用户通过页面选择登录策略
3. **OAuth2 登录**:支持 OAuth2 登录策略(最简单模式)
4. **Session ID 登录**:支持 Session ID 登录策略(最简单模式)
5. **Salesforce CLI 登录**:支持 Salesforce CLI 登录策略
6. **Legacy Credential 登录**:支持 Legacy Credential 登录策略(传统账密凭证)
7. **扩展性**:支持扩展新的登录策略(预留接口)
8. **OAuth2 授权流程**OAuth2 登录支持三种授权流程
9. **Session ID 验证**Session ID 登录通过 Identity API 验证 Session ID 并获取用户信息
10. **Legacy Credential SOAP**Legacy Credential 登录使用 SOAP API
11. **Salesforce CLI 命令**Salesforce CLI 登录通过命令行工具获取 Session
12. **工厂方法模式**:登录策略工厂使用工厂方法模式进行依赖注入
## 业务上下文
### 当前问题
- 缺乏对不同类型 Salesforce 系统登录的支持
- 缺乏策略模式实现登录方式
- 缺乏用户选择登录策略的功能
### 业务场景
```
Salesforce 策略模式登录
├─ 策略模式实现不同登录方式
├─ 用户通过页面选择登录策略
├─ OAuth2 登录(最简单模式)
│ ├─ 支持密码流程password
│ ├─ 支持客户端凭证流程client_credentials
│ ├─ 支持授权码流程authorization_code
│ ├─ 支持刷新 Session
│ └─ 支持登出操作
├─ Session ID 登录(最简单模式)
│ ├─ 使用已有的 Salesforce Session ID 进行登录
│ ├─ 通过 Identity API 验证 Session ID
│ ├─ 支持登出操作
│ └─ 不支持刷新 Session
├─ Salesforce CLI 登录
│ ├─ 通过 Salesforce CLI 命令行工具获取 Session
│ ├─ 支持组织别名org_alias
│ ├─ 支持刷新 Session重新获取
│ └─ 支持登出操作
└─ Legacy Credential 登录(传统账密凭证)
├─ 使用 SOAP API 进行登录
├─ 支持用户名、密码、安全令牌
├─ 不支持刷新 Session
└─ 支持登出操作
```
### 应用场景
1. **灵活登录**:用户可以选择不同的登录策略进行登录
2. **OAuth2 登录**:使用 OAuth2 方式登录 Salesforce
3. **Session ID 登录**:使用已有的 Session ID 快速登录 Salesforce
4. **Salesforce CLI 登录**:使用 Salesforce CLI 命令行工具获取 Session
5. **Legacy Credential 登录**:使用传统账密凭证方式登录 Salesforce
## 功能需求
### 核心功能
#### 功能 1策略模式实现
- **描述**:使用策略模式实现不同类型的 Salesforce 系统登录
- **验收标准**
1. 定义登录策略接口LoginStrategy
2. 实现 OAuth2 登录策略OAuth2LoginStrategy
3. 实现 Session ID 登录策略SessionIdLoginStrategy
4. 实现 Salesforce CLI 登录策略SalesforceCliLoginStrategy
5. 实现 Legacy Credential 登录策略LegacyCredentialLoginStrategy
6. 支持扩展新的登录策略(预留接口)
7. 策略接口包含 login、refreshToken、logout、getLoginType 方法
- **优先级**:高
- **依赖关系**依赖多系统配置功能2026-01-21-003-01
#### 功能 2登录策略工厂
- **描述**:登录策略工厂使用工厂方法模式进行依赖注入
- **验收标准**
1. 创建登录策略工厂LoginStrategyFactory
2. 使用工厂方法模式进行依赖注入
3. 根据登录类型返回对应的策略实例
4. 支持获取所有支持的登录类型
5. 支持动态注册新的登录策略
- **优先级**:高
- **依赖关系**:依赖策略模式实现功能
#### 功能 3OAuth2 登录
- **描述**:支持 OAuth2 登录策略(最简单模式)
- **验收标准**
1. 支持密码流程password
2. 支持客户端凭证流程client_credentials
3. 支持授权码流程authorization_code
4. 支持刷新 Session
5. 支持登出操作
6. 登录成功后返回 Session IDAccess Token、Server URLInstance URL、用户信息、组织信息
7. 登录失败时返回错误信息
8. 支持自定义登录 URLlogin_url
9. 授权码流程支持 state 参数(防止 CSRF 攻击)
- **优先级**:高
- **依赖关系**:依赖登录策略工厂功能
#### 功能 4Session ID 登录
- **描述**:支持 Session ID 登录策略(最简单模式)
- **验收标准**
1. 使用已有的 Salesforce Session ID 进行登录
2. 通过 Identity API 验证 Session ID
3. 获取用户信息
4. 支持登出操作
5. 不支持刷新 Session
6. 登录成功后返回 Session ID、Server URL、用户信息、组织信息
7. 登录失败时返回错误信息
- **优先级**:高
- **依赖关系**:依赖登录策略工厂功能
#### 功能 5Salesforce CLI 登录
- **描述**:支持 Salesforce CLI 登录策略
- **验收标准**
1. 通过 Salesforce CLI 命令行工具获取 Session
2. 支持组织别名org_alias参数
3. 支持刷新 Session重新获取
4. 支持登出操作
5. 登录成功后返回 Session ID、Instance URL、用户信息、组织信息
6. 登录失败时返回错误信息
7. 检查 Salesforce CLI 是否已安装
- **优先级**:高
- **依赖关系**:依赖登录策略工厂功能
#### 功能 6Legacy Credential 登录
- **描述**:支持 Legacy Credential 登录策略(传统账密凭证)
- **验收标准**
1. 使用 SOAP API 进行登录
2. 支持用户名、密码、安全令牌参数
3. 不支持刷新 Session
4. 支持登出操作
5. 登录成功后返回 Session ID、Server URL、用户信息、组织信息
6. 登录失败时返回错误信息
7. 支持自定义登录 URLlogin_url
8. 提供友好的错误消息(中文)
- **优先级**:高
- **依赖关系**:依赖登录策略工厂功能
#### 功能 7用户选择登录策略
- **描述**:用户通过页面选择登录策略
- **验收标准**
1. 提供登录策略选择界面
2. 显示所有支持的登录策略
3. 用户选择登录策略后执行登录
4. 根据选择的策略显示对应的登录表单
5. OAuth2 登录表单包含 login_url、client_id、client_secret、grant_type、username、password、security_token、code、state
6. Session ID 登录表单包含 login_url、session_id、server_url
7. Salesforce CLI 登录表单包含 org_alias
8. Legacy Credential 登录表单包含 login_url、username、password、security_token
- **优先级**:高
- **依赖关系**:依赖登录策略工厂功能
#### 功能 8配置回写
- **描述**:登录成功后回写 SF 返回的信息到系统配置表
- **验收标准**
1. 回写 Session IDAccess Token由 Salesforce 登录后返回)
2. 回写 Server URLInstance URL
3. 回写用户信息(用户 ID、用户名等
4. 回写组织信息(组织 ID、组织名称等
5. 回写访问令牌Access Token
6. 支持定时刷新令牌OAuth2 登录支持)
- **优先级**:高
- **依赖关系**:依赖 OAuth2 登录功能、Session ID 登录功能
## 非功能需求
### 性能需求
- **登录时间**:登录响应时间 < 3
- **并发用户数**支持 100+ 并发用户
### 安全需求
- **认证方式**使用现有的 Spring Security 认证机制
- **数据安全**登录过程中的敏感信息使用 HTTPS 传输
### 可用性需求
- **系统可用性**99.9%
- **容错机制**登录失败时自动重试
### 可维护性需求
- **代码可读性**代码符合项目编码规范注释完整
- **测试覆盖率**单元测试覆盖率 80%
## 数据需求
### 数据模型
#### datai_sf_system_configSalesforce 系统配置表)
```
datai_sf_system_config (Salesforce 系统配置表)
├─ id (BIGINT) - 主键ID
├─ system_name (VARCHAR) - 系统名称(唯一)
├─ system_type (VARCHAR) - 系统类型(用户自定义)
├─ org_type (VARCHAR) - 组织类型S=源 org T=目标 org ST=源和目标 org可同时选中
├─ login_type (VARCHAR) - 登录类型oauth2/session_id/cli/legacy_credential
├─ login_url (VARCHAR) - 登录 URL如 https://login.salesforce.com
├─ client_id (VARCHAR) - OAuth 客户端 ID
├─ client_secret (VARCHAR) - OAuth 客户端密钥(使用 EncryptUtils 加密存储)
├─ grant_type (VARCHAR) - OAuth 授权类型password/client_credentials/authorization_code
├─ username (VARCHAR) - 用户名
├─ password (VARCHAR) - 密码(使用 EncryptUtils 加密存储)
├─ security_token (VARCHAR) - 安全令牌(使用 EncryptUtils 加密存储)
├─ session_id (VARCHAR) - Session ID由 Salesforce 登录后返回)
├─ server_url (VARCHAR) - 服务器 URLInstance URL
├─ refresh_token (VARCHAR) - 刷新令牌
├─ token_expires_at (DATETIME) - 令牌过期时间
├─ org_alias (VARCHAR) - Salesforce CLI 组织别名
├─ private_key_path (VARCHAR) - 私有密钥路径
├─ private_key_password (VARCHAR) - 私有密钥密码(使用 EncryptUtils 加密存储)
├─ code (VARCHAR) - OAuth 授权码
├─ state (VARCHAR) - OAuth state 参数,用于防止 CSRF 攻击
├─ sf_user_id (VARCHAR) - Salesforce 用户 ID由 Salesforce 登录后返回)
├─ user_id (VARCHAR) - 用户 ID由 Salesforce 登录后返回)
├─ org_id (VARCHAR) - 组织 ID由 Salesforce 登录后返回)
├─ org_name (VARCHAR) - 组织名称(由 Salesforce 登录后返回)
├─ status (CHAR) - 状态0正常 1停用
├─ sort_order (INT) - 排序
├─ create_by (VARCHAR) - 创建者
├─ create_time (DATETIME) - 创建时间
├─ update_by (VARCHAR) - 更新者
└─ update_time (DATETIME) - 更新时间
```
### 数据存储需求
- **数据库类型**MySQL 8.3.0
- **存储容量**单表支持 1000 + 数据
- **数据备份策略**每日备份保留 7
### 数据流转需求
```
登录认证
└─ 读取系统配置
└─ 使用 EncryptUtils 解密敏感信息
└─ 用户通过页面选择登录策略
└─ 根据登录类型选择对应的策略OAuth2/Session ID/Salesforce CLI/Legacy Credential
└─ OAuth2 登录支持三种授权流程:
├─ 密码流程password
├─ 客户端凭证流程client_credentials
└─ 授权码流程authorization_code
└─ Session ID 登录使用已有的 Salesforce Session ID 进行登录
└─ Session ID 登录通过 Identity API 验证 Session ID 并获取用户信息
└─ Salesforce CLI 登录通过命令行工具获取 Session
└─ Legacy Credential 登录使用 SOAP API 进行传统账密凭证登录
└─ Session ID 由 Salesforce 登录后返回
└─ 回写 SF 返回信息到系统配置
```
## 业务规则
1. **用户选择登录策略**用户通过在页面上选择对应的登录策略
2. **Session ID 获取方式**Session ID Salesforce 登录后返回给到
3. **Access Token 等同 Session ID**对于 Salesforce 来说Access Token 就是 Session ID两者是同一个概念
4. **OAuth2 登录支持**OAuth2 登录支持三种授权流程passwordclient_credentialsauthorization_code
5. **OAuth2 刷新 Session**OAuth2 登录支持刷新 Session
6. **OAuth2 登出**OAuth2 登录支持登出操作
7. **OAuth2 自定义登录 URL**OAuth2 登录支持自定义登录 URLlogin_url
8. **OAuth2 state 参数**授权码流程必须使用 state 参数防止 CSRF 攻击
9. **Session ID 登录验证**Session ID 登录通过 Identity API 验证 Session ID 并获取用户信息
10. **Session ID 登出不支持刷新**Session ID 登录不支持刷新 Session
11. **Session ID 登出**Session ID 登录支持登出操作
12. **Salesforce CLI 登录**Salesforce CLI 登录通过命令行工具获取 Session
13. **Salesforce CLI 组织别名**Salesforce CLI 登录支持组织别名org_alias参数
14. **Salesforce CLI 刷新 Session**Salesforce CLI 登录支持刷新 Session重新获取
15. **Salesforce CLI 登出**Salesforce CLI 登录支持登出操作
16. **Legacy Credential 登录**Legacy Credential 登录使用 SOAP API 进行传统账密凭证登录
17. **Legacy Credential 不支持刷新**Legacy Credential 登录不支持刷新 Session
18. **Legacy Credential 登出**Legacy Credential 登录支持登出操作
19. **Legacy Credential 自定义登录 URL**Legacy Credential 登录支持自定义登录 URLlogin_url
20. **Legacy Credential 错误消息**Legacy Credential 登录提供友好的中文错误消息
21. **配置回写**登录成功后必须回写 SF 返回的信息
## 接口需求
### 登录接口
1. **OAuth2 登录**
- 接口路径POST /api/salesforce/auth/oauth2/login
- 请求参数
- **通用参数**
- `login_url`可选登录 URL https://login.salesforce.com
- `grant_type`必填授权流程类型password/client_credentials/authorization_code
- `system_id`必填系统配置 ID
- **密码流程password**
- `client_id`必填OAuth 客户端 ID
- `client_secret`必填OAuth 客户端密钥
- `username`必填用户名
- `password`必填密码
- `security_token`可选安全令牌
- **客户端凭证流程client_credentials**
- `client_id`必填OAuth 客户端 ID
- `client_secret`必填OAuth 客户端密钥
- **授权码流程authorization_code**
- `client_id`必填OAuth 客户端 ID
- `client_secret`必填OAuth 客户端密钥
- `code`必填授权码
- `redirect_uri`必填重定向 URI
- `state`必填state 参数用于防止 CSRF 攻击
- 响应Session IDServer URL用户信息组织信息
2. **Session ID 登录**
- 接口路径POST /api/salesforce/auth/session/login
- 请求参数
- `login_url`可选登录 URL https://login.salesforce.com
- `system_id`必填系统配置 ID
- `session_id`必填Session ID
- `server_url`必填服务器 URL
- 响应Session IDServer URL用户信息组织信息
3. **Salesforce CLI 登录**
- 接口路径POST /api/salesforce/auth/cli/login
- 请求参数
- `system_id`必填系统配置 ID
- `org_alias`可选组织别名
- 响应Session IDInstance URL用户信息组织信息
4. **Legacy Credential 登录**
- 接口路径POST /api/salesforce/auth/legacy/login
- 请求参数
- `login_url`可选登录 URL https://login.salesforce.com
- `system_id`必填系统配置 ID
- `username`必填用户名
- `password`必填密码
- `security_token`可选安全令牌
- 响应Session IDServer URL用户信息组织信息
5. **刷新 Session**
- 接口路径POST /api/salesforce/auth/oauth2/refresh
- 请求参数
- `system_id`必填系统配置 ID
- `refresh_token`必填刷新令牌
- 响应新的 Session IDServer URL
6. **登出**
- 接口路径POST /api/salesforce/auth/logout
- 请求参数
- `system_id`必填系统配置 ID
- `login_type`必填登录类型oauth2/session_id/cli/legacy_credential
- 响应成功/失败
7. **获取支持的登录类型**
- 接口路径GET /api/salesforce/auth/login-types
- 响应支持的登录类型列表
## 依赖关系
- 依赖 `2026-01-21-003-01`多系统配置
- 依赖 `datai-common` 模块的 `EncryptUtils` 工具类
- 依赖 `datai-salesforce-common` 模块的 Salesforce API 封装
- 依赖 `datai-salesforce-auth` 模块的登录策略实现
## 后续需求
- 2026-01-21-003-03登录历史
- 2026-01-21-003-04缓存优化
- 2026-01-21-003-05会话管理
- 2026-01-21-003-06登录状态查询
- 2026-01-21-003-07错误码映射