35 KiB
Salesforce 多系统认证需求
元数据
- 需求编号:2026-01-21-003
- 创建时间:2026-01-21
- 创建人:SSOT 架构师
- 状态:进行中
- 优先级:高
需求概述
实现 Salesforce 多系统认证功能,支持配置多个不同类型的 Salesforce 系统,使用策略模式实现登录(支持 OAuth2、Session ID、Salesforce CLI、Legacy Credential 登录),区分源 org 和目标 org(支持同一系统既是源 org 又是目标 org),记录登录历史信息(包含审计信息),回写 SF 返回信息到系统配置表,并使用 Redis 缓存保存登录信息(支持缓存有效性校验)。支持选择历史登录成功信息快速登录为源 org 或目标 org。支持会话管理,会话失效时自动重新登录。建立完整的错误码映射枚举类,提供友好的错误提示,支持错误重试机制。
子需求列表
本需求已拆分为以下 7 个可独立实现的子需求:
-
2026-01-21-003-01-salesforce-multi-system-config - Salesforce 多系统配置
- 支持配置多个不同类型的 Salesforce 系统
- 支持用户自定义系统类型
- 支持区分源 org 和目标 org
- 支持敏感信息加密存储
-
2026-01-21-003-02-salesforce-strategy-login - Salesforce 策略模式登录
- 使用策略模式实现不同类型的 Salesforce 系统登录
- 支持 OAuth2 登录策略
- 支持 Session ID 登录策略
- 登录策略工厂使用工厂方法模式
-
2026-01-21-003-03-salesforce-login-history - Salesforce 登录历史
- 记录所有登录历史信息
- 包含审计信息
- 支持选择历史登录成功信息快速登录
-
2026-01-21-003-04-salesforce-cache-optimization - Salesforce 缓存优化
- 登录成功后将 SF 登录信息保存到 Redis 缓存
- 使用时校验有效性
- 结构化缓存键设计
- 缓存刷新和清理
-
2026-01-21-003-05-salesforce-session-management - Salesforce 会话管理
- 支持会话管理
- 会话失效时自动重新登录
- 获取当前 Session ID 和 Instance URL
-
2026-01-21-003-06-salesforce-login-status-query - Salesforce 登录状态查询
- 提供登录状态查询接口
- 显示每个系统的登录状态
- Session ID 脱敏处理
-
2026-01-21-003-07-salesforce-error-code-mapping - Salesforce 错误码映射
- 建立完整的错误码映射表
- 提供友好的错误提示
- 支持错误重试机制
目标
本需求已拆分为 7 个可独立实现的子需求,详细目标请参考各子需求文档。
实现顺序建议
建议按照以下顺序实现各子需求:
- 2026-01-21-003-01:多系统配置(基础功能,其他子需求依赖)
- 2026-01-21-003-02:策略模式登录(核心登录功能)
- 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:错误码映射(错误处理功能)
业务上下文
当前问题
- 系统只支持单个 Salesforce 系统配置
- 缺乏对不同类型 Salesforce 系统的支持
- 缺乏源 org 和目标 org 的区分
- 缺乏登录历史记录功能
- 缺乏登录信息缓存机制
- 缺乏审计信息记录功能
- 缺乏会话管理功能
- 缺乏会话失效时自动重新登录机制
业务场景
Salesforce 多系统认证
├─ 系统配置
│ ├─ 支持多个 Salesforce 系统
│ ├─ 支持用户自定义系统类型
│ ├─ 支持区分源 org 和目标 org
│ ├─ 支持同一系统既是源 org 又是目标 org
│ ├─ 支持配置登录 URL、grant_type、org_alias 等字段
│ ├─ 敏感信息加密存储(使用 EncryptUtils)
│ └─ 无需审批,无权限限制
├─ 登录认证
│ ├─ 策略模式实现不同登录方式
│ ├─ 用户通过页面选择登录策略
│ ├─ OAuth2 登录
│ │ ├─ 支持密码流程(password)
│ │ ├─ 支持客户端凭证流程(client_credentials)
│ │ ├─ 支持授权码流程(authorization_code)
│ │ ├─ 支持刷新 Session
│ │ └─ 支持登出操作
│ ├─ Session ID 登录
│ │ ├─ 使用已有的 Salesforce Session ID 进行登录
│ │ ├─ 通过 Identity API 验证 Session ID
│ │ ├─ 支持登出操作
│ │ └─ 不支持刷新 Session
│ ├─ Salesforce CLI 登录
│ │ ├─ 使用 Salesforce CLI 进行登录
│ │ ├─ 通过 CLI 命令获取 Session ID
│ │ ├─ 支持登出操作
│ │ └─ 不支持刷新 Session
│ └─ Legacy Credential 登录
│ ├─ 使用遗留凭证进行登录
│ ├─ 支持登出操作
│ └─ 不支持刷新 Session
├─ 登录历史
│ ├─ 记录登录时间
│ ├─ 记录登录用户
│ ├─ 记录登录结果
│ ├─ 记录登录 IP
│ ├─ 记录审计信息(设备信息、浏览器信息、地理位置等)
│ ├─ 支持查询登录历史
│ ├─ 支持分页查询
│ ├─ 支持导出登录历史为 Excel 文件
│ └─ 支持选择历史登录成功信息快速登录
├─ 配置回写
│ ├─ 回写 Session ID(Access Token,由 Salesforce 登录后返回)
│ ├─ 回写 Server URL(Instance URL)
│ ├─ 回写用户信息(用户 ID、用户名等)
│ └─ 回写组织信息(组织 ID、组织名称等)
├─ 缓存优化
│ ├─ 缓存 Session ID(Access Token)
│ ├─ 缓存 Server URL(Instance URL)
│ ├─ 缓存用户信息
│ ├─ 缓存组织信息
│ ├─ 使用时校验有效性
│ ├─ 登录成功后刷新 org 配置名称加 org 类型的缓存
│ ├─ 过期时 Redis 自动清理,或者登出接口清除当前缓存
│ ├─ 结构化缓存键设计(CURRENT_SOURCE_ORG_RESULT、CURRENT_TARGET_ORG_RESULT)
│ └─ 支持会话管理(datai_sf_login_session 表)
├─ 会话管理
│ ├─ 获取当前 Salesforce 会话信息(按 org 类型)
│ ├─ 会话失效时自动重新登录
│ ├─ 获取当前 Session ID
│ ├─ 获取当前 Instance URL
│ ├─ 判断会话是否有效
│ ├─ 支持会话信息的增删改查
│ ├─ 支持查询最近一条活跃的会话信息
│ ├─ 支持根据 ORG 类型查询最近一条活跃的会话信息
│ ├─ 支持会话状态(active/inactive)和最后活动时间管理
│ └─ 支持自动重新登录
├─ 登录状态查询
│ ├─ 提供查询接口返回当前所有系统的登录状态
│ ├─ 显示每个系统的登录状态(已登录/未登录/已过期)
│ ├─ 显示每个系统的 Session ID(脱敏处理)
│ ├─ 显示每个系统的过期时间
│ ├─ 支持按 org 类型筛选查询结果
│ ├─ 支持按系统 ID 查询特定系统的登录状态
│ └─ 支持会话信息管理
└─ 错误码映射
├─ 在 datai-salesforce-common 模块中生成错误码映射枚举类
├─ 映射 Salesforce 错误码到系统错误码
├─ 提供友好的错误提示
├─ 支持错误级别(ERROR=错误 WARN=警告 INFO=信息)
├─ 支持是否可重试(true=可重试 false=不可重试)
├─ 支持建议重试次数、建议重试间隔(毫秒)
└─ 根据枚举类中的配置决定是否重试及重试次数
应用场景
- 多环境管理:管理生产环境、沙盒环境、自定义环境等多个 Salesforce 系统
- 登录审计:审计所有 Salesforce 登录操作,包含详细的审计信息
- 性能优化:使用 Redis 缓存减少重复登录,使用时校验有效性
- 灵活配置:用户可以自定义系统类型,无需审批和权限限制
- 快速登录:用户可以选择历史登录成功信息快速登录为源 org 或目标 org
- 会话管理:自动管理会话,会话失效时自动重新登录,提升用户体验
功能需求
核心功能
功能 1:多系统配置
- 描述:支持配置多个不同类型的 Salesforce 系统
- 验收标准:
- 支持配置多个 Salesforce 系统
- 支持用户自定义系统类型(不限于 production/sandbox/developer)
- 支持区分源 org 和目标 org
- 支持同一系统既是源 org 又是目标 org
- 支持配置系统名称、自定义类型、登录方式等
- 支持配置登录 URL、grant_type、org_alias 等字段
- 支持启用/停用系统
- 系统配置变更无需审批流程
- 系统配置无权限限制
- 密码、安全令牌等敏感信息使用 EncryptUtils 加密存储
- 优先级:高
- 依赖关系:依赖数据库表设计
功能 2:策略模式登录
- 描述:使用策略模式实现不同类型的 Salesforce 系统登录,用户通过页面选择登录策略
- 验收标准:
- 支持 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 登录使用 CLI 命令获取 Session ID
- Legacy Credential 登录使用遗留凭证进行登录
- 登录策略工厂使用工厂方法模式进行依赖注入
- 优先级:高
- 依赖关系:依赖多系统配置功能
功能 3:源目标区分
- 描述:划分 SF 系统为源 org 和目标 org,支持同一系统既是源 org 又是目标 org
- 验收标准:
- 支持标记系统为源 org 或目标 org
- 支持同一系统既是源 org 又是目标 org
- 支持查询所有源 org
- 支持查询所有目标 org
- 支持根据类型筛选系统
- 优先级:高
- 依赖关系:依赖多系统配置功能
功能 4:登录历史
- 描述:记录所有登录历史信息,包含审计信息
- 验收标准:
- 记录登录时间
- 记录登录用户
- 记录登录结果(成功/失败)
- 记录登录 IP
- 记录失败原因
- 记录审计信息(设备信息、浏览器信息、地理位置等)
- 支持查询登录历史
- 支持分页查询
- 支持导出登录历史为 Excel 文件
- 支持选择历史登录成功信息快速登录为源 org 或目标 org
- 优先级:高
- 依赖关系:依赖策略模式登录功能
功能 5:配置回写
- 描述:登录成功后回写 SF 返回的信息到系统配置表
- 验收标准:
- 回写 Session ID(Access Token,由 Salesforce 登录后返回)
- 回写 Server URL(Instance URL)
- 回写用户信息(用户 ID、用户名等)
- 回写组织信息(组织 ID、组织名称等)
- 回写访问令牌(Access Token)
- 支持定时刷新令牌(OAuth2 登录支持)
- 优先级:高
- 依赖关系:依赖策略模式登录功能
功能 6:缓存优化
- 描述:登录成功后将 SF 登录信息保存到 Redis 缓存,使用时校验有效性
- 验收标准:
- 缓存 Session ID(Access Token)
- 缓存 Server URL(Instance URL)
- 缓存用户信息
- 缓存组织信息
- 缓存 Access Token 和过期时间戳
- 设置合理的缓存过期时间(2 小时)
- 使用缓存时校验有效性(检查过期时间戳)
- 缓存失效时自动重新登录
- Session ID 的有效期通过成功登录后存入缓存中,设置过期时间
- 若是过期了,Redis 则没有 Session ID
- 在缓存中存储过期时间戳,使用前进行校验
- 并发登录使用 Salesforce 用户 ID + 系统 ID 存储缓存
- 设计结构化的缓存键:
sf:auth:{userId}:{systemId}:{orgType} - 支持会话管理(datai_sf_login_session 表)
- 支持会话状态(active/inactive)和最后活动时间管理
- 支持自动重新登录
- 优先级:高
- 依赖关系:依赖 datai-cache-redis 模块
功能 7:缓存刷新
- 描述:Salesforce 登录成功后,刷新当前系统中对于 org 配置名称加 org 类型的缓存
- 验收标准:
- 登录成功后自动刷新 org 配置名称加 org 类型的缓存
- 缓存刷新失败后的处理机制
- 缓存刷新的日志记录
- 优先级:高
- 依赖关系:依赖缓存优化功能
功能 8:缓存清理
- 描述:过期时 Redis 自动清理,或者登出接口清除当前缓存
- 验收标准:
- 过期时 Redis 自动清理缓存
- 提供登出接口清除当前缓存
- 缓存清理失败后的处理机制
- 缓存清理的日志记录
- 优先级:高
- 依赖关系:依赖缓存优化功能
功能 9:历史登录快速使用
- 描述:支持选择历史登录成功信息快速登录为源 org 或目标 org
- 验收标准:
- 支持查询历史登录成功的记录
- 支持选择历史登录成功信息
- 支持将历史登录成功信息快速设置为源 org
- 支持将历史登录成功信息快速设置为目标 org
- 支持验证历史登录信息的有效性
- 优先级:高
- 依赖关系:依赖登录历史功能
功能 10:会话管理
- 描述:支持会话管理,会话失效时自动重新登录
- 验收标准:
- 获取当前 Salesforce 会话信息(按 org 类型)
- 会话失效时自动重新登录
- 获取当前 Session ID
- 获取当前 Instance URL
- 判断会话是否有效
- 支持按 org 类型(source/target)管理会话
- 支持自动登录(基于历史登录记录)
- 支持会话信息的增删改查
- 支持查询最近一条活跃的会话信息
- 支持根据 ORG 类型查询最近一条活跃的会话信息
- 支持会话状态(active/inactive)和最后活动时间管理
- 优先级:高
- 依赖关系:依赖缓存优化功能、登录历史功能
功能 11:登录状态查询
- 描述:提供登录状态查询接口,用户可以查看当前所有系统的登录状态
- 验收标准:
- 提供查询接口返回当前所有系统的登录状态
- 显示每个系统的登录状态(已登录/未登录/已过期)
- 显示每个系统的 Session ID(脱敏处理)
- 显示每个系统的过期时间
- 支持按 org 类型筛选查询结果
- 支持按系统 ID 查询特定系统的登录状态
- 支持会话信息管理
- 优先级:高
- 依赖关系:依赖缓存优化功能、会话管理功能
功能 12:错误码映射
- 描述:在 datai-salesforce-common 模块中生成错误码映射枚举类,提供友好的错误提示
- 验收标准:
- 在 datai-salesforce-common 模块中生成错误码映射枚举类
- 枚举类包含 Salesforce 错误码
- 枚举类包含系统错误码
- 枚举类包含系统错误信息(友好的错误提示)
- 枚举类包含错误级别(ERROR=错误 WARN=警告 INFO=信息)
- 枚举类包含是否可重试(true=可重试 false=不可重试)
- 枚举类包含建议重试次数
- 枚举类包含建议重试间隔(毫秒)
- 枚举类包含错误描述
- 支持根据 Salesforce 错误码查询系统错误码
- 支持根据系统错误码查询 Salesforce 错误码
- 支持获取所有错误码映射
- 支持判断错误是否可重试
- 支持获取重试次数和重试间隔
- 优先级:高
- 依赖关系:依赖 datai-salesforce-common 模块
非功能需求
性能需求
- 登录时间:登录响应时间 < 3 秒
- 缓存时间:缓存读取时间 < 10ms
- 缓存校验时间:缓存有效性校验时间 < 5ms
- 并发用户数:支持 100+ 并发用户
安全需求
- 认证方式:使用现有的 Spring Security 认证机制
- 数据安全:密码、安全令牌等敏感信息使用 EncryptUtils 加密存储
- 审计日志:记录所有登录操作和审计信息
可用性需求
- 系统可用性:99.9%
- 容错机制:登录失败时自动重试
- 灾备方案:缓存失效时自动重新登录
可维护性需求
- 代码可读性:代码符合项目编码规范,注释完整
- 测试覆盖率:单元测试覆盖率 ≥ 80%
数据需求
数据模型
datai_sf_system_config(Salesforce 系统配置表)
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
├─ grant_type (VARCHAR) - OAuth2 授权类型(password/client_credentials/authorization_code)
├─ org_alias (VARCHAR) - 组织别名
├─ client_id (VARCHAR) - OAuth 客户端 ID
├─ client_secret (VARCHAR) - OAuth 客户端密钥(使用 EncryptUtils 加密存储)
├─ username (VARCHAR) - 用户名
├─ password (VARCHAR) - 密码(使用 EncryptUtils 加密存储)
├─ security_token (VARCHAR) - 安全令牌(使用 EncryptUtils 加密存储)
├─ session_id (VARCHAR) - Session ID(由 Salesforce 登录后返回)
├─ server_url (VARCHAR) - 服务器 URL(Instance URL)
├─ refresh_token (VARCHAR) - 刷新令牌
├─ token_expires_at (DATETIME) - 令牌过期时间
├─ 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) - 更新时间
datai_sf_login_history(Salesforce 登录历史表)
datai_sf_login_history (Salesforce 登录历史表)
├─ id (BIGINT) - 主键ID
├─ system_id (BIGINT) - 系统配置 ID
├─ login_type (VARCHAR) - 登录类型(oauth2/session_id/cli/legacy_credential)
├─ username (VARCHAR) - 登录用户名
├─ login_result (CHAR) - 登录结果(S=成功 F=失败)
├─ failure_reason (VARCHAR) - 失败原因
├─ login_ip (VARCHAR) - 登录 IP
├─ device_info (VARCHAR) - 设备信息(审计信息)
├─ browser_info (VARCHAR) - 浏览器信息(审计信息)
├─ location_info (VARCHAR) - 地理位置(审计信息)
├─ session_id (VARCHAR) - Session ID(仅成功登录时记录,由 Salesforce 登录后返回)
├─ server_url (VARCHAR) - 服务器 URL(Instance URL,仅成功登录时记录)
├─ user_id (VARCHAR) - 用户 ID(仅成功登录时记录,由 Salesforce 登录后返回)
├─ org_id (VARCHAR) - 组织 ID(仅成功登录时记录,由 Salesforce 登录后返回)
├─ org_name (VARCHAR) - 组织名称(仅成功登录时记录,由 Salesforce 登录后返回)
├─ token_expires_at (DATETIME) - 令牌过期时间(仅成功登录时记录)
├─ login_time (DATETIME) - 登录时间
└─ create_time (DATETIME) - 创建时间
datai_sf_login_session(Salesforce 登录会话表)
datai_sf_login_session (Salesforce 登录会话表)
├─ id (BIGINT) - 主键ID
├─ system_id (BIGINT) - 系统配置 ID
├─ org_type (VARCHAR) - 组织类型(source/target)
├─ session_id (VARCHAR) - Session ID(由 Salesforce 登录后返回)
├─ server_url (VARCHAR) - 服务器 URL(Instance URL)
├─ user_id (VARCHAR) - 用户 ID(由 Salesforce 登录后返回)
├─ org_id (VARCHAR) - 组织 ID(由 Salesforce 登录后返回)
├─ org_name (VARCHAR) - 组织名称(由 Salesforce 登录后返回)
├─ session_status (VARCHAR) - 会话状态(active/inactive)
├─ last_activity_time (DATETIME) - 最后活动时间
├─ token_expires_at (DATETIME) - 令牌过期时间
├─ create_time (DATETIME) - 创建时间
├─ update_time (DATETIME) - 更新时间
└─ create_by (VARCHAR) - 创建者
错误码映射枚举类(datai-salesforce-common 模块)
SalesforceErrorCode 枚举类
├─ sfErrorCode (String) - Salesforce 错误码
├─ sfErrorMessage (String) - Salesforce 错误信息
├─ systemErrorCode (String) - 系统错误码
├─ systemErrorMessage (String) - 系统错误信息(友好的错误提示)
├─ errorLevel (ErrorLevel) - 错误级别(ERROR=错误 WARN=警告 INFO=信息)
├─ isRetryable (boolean) - 是否可重试(true=可重试 false=不可重试)
├─ retryCount (int) - 建议重试次数
├─ retryInterval (long) - 建议重试间隔(毫秒)
└─ description (String) - 错误描述
ErrorLevel 枚举类
├─ ERROR ("E", "错误")
├─ WARN ("W", "警告")
└─ INFO ("I", "信息")
数据存储需求
- 数据库类型:MySQL 8.3.0
- 存储容量:单表支持 1000 万+ 数据
- 数据备份策略:每日备份,保留 7 天
数据流转需求
系统配置
└─ 管理员添加/编辑/删除 Salesforce 系统
└─ 更新数据库中的系统配置
└─ 支持配置登录 URL、grant_type、org_alias 等字段
└─ 密码、安全令牌等敏感信息使用 EncryptUtils 加密存储
└─ 无需审批流程
└─ 无权限限制
登录认证
└─ 读取系统配置
└─ 使用 EncryptUtils 解密敏感信息
└─ 用户通过页面选择登录策略
└─ 根据登录类型选择对应的策略
├─ OAuth2 登录
│ ├─ 支持三种授权流程(password、client_credentials、authorization_code)
│ ├─ 支持刷新 Session
│ └─ 支持登出操作
├─ Session ID 登录
│ ├─ 使用已有的 Salesforce Session ID 进行登录
│ ├─ 通过 Identity API 验证 Session ID 并获取用户信息
│ ├─ 支持登出操作
│ └─ 不支持刷新 Session
├─ Salesforce CLI 登录
│ ├─ 使用 Salesforce CLI 进行登录
│ ├─ 通过 CLI 命令获取 Session ID
│ ├─ 支持登出操作
│ └─ 不支持刷新 Session
└─ Legacy Credential 登录
├─ 使用遗留凭证进行登录
├─ 支持登出操作
└─ 不支持刷新 Session
└─ Session ID 由 Salesforce 登录后返回
└─ 记录登录历史(包含审计信息)
└─ 回写 SF 返回信息到系统配置
└─ 保存登录信息到 Redis 缓存
└─ 设置缓存过期时间为 2 小时
└─ 刷新当前系统中对于 org 配置名称加 org 类型的缓存
会话管理
└─ 获取当前 Salesforce 会话信息(按 org 类型)
└─ 判断会话是否有效
└─ 会话失效时自动重新登录
└─ 基于历史登录记录进行自动登录
└─ 获取当前 Session ID
└─ 获取当前 Instance URL
└─ 支持会话信息的增删改查
└─ 支持查询最近一条活跃的会话信息
└─ 支持根据 ORG 类型查询最近一条活跃的会话信息
└─ 支持会话状态(active/inactive)和最后活动时间管理
使用缓存
└─ 从 Redis 读取登录信息
└─ 校验缓存有效性(检查过期时间)
└─ 有效则直接使用
└─ 无效则重新登录
缓存清理
└─ 过期时 Redis 自动清理缓存
└─ 或者通过登出接口清除当前缓存
历史登录快速使用
└─ 查询历史登录成功的记录
└─ 选择历史登录成功信息
└─ 验证历史登录信息的有效性
└─ 将历史登录成功信息快速设置为源 org 或目标 org
错误码映射
└─ 在 datai-salesforce-common 模块中维护枚举类
└─ 枚举类包含 Salesforce 错误码、系统错误码、错误级别、重试配置
└─ 提供友好的错误提示
└─ 捕获 Salesforce 错误
└─ 根据枚举类查找对应的系统错误码
└─ 返回友好的错误提示
└─ 根据枚举类中的配置决定是否重试
└─ 根据枚举类中的配置决定重试次数和重试间隔
业务规则
- 系统名称唯一性:系统名称(system_name)必须唯一
- 用户自定义类型:系统类型(system_type)由用户自定义,不限制为固定值
- 源目标区分:每个系统可以标记为源 org 或目标 org,支持同一系统既是源 org 又是目标 org
- 登录策略选择:用户通过页面选择登录策略,系统不自动选择
- 登录历史记录:每次登录都必须记录历史,包含审计信息
- 配置回写:登录成功后必须回写 SF 返回的信息
- 缓存策略:登录信息必须缓存到 Redis,设置过期时间为 2 小时
- 缓存有效性校验:使用缓存时必须校验有效性(检查 token_expires_at)
- 敏感信息加密:密码、安全令牌等敏感信息必须使用 EncryptUtils 加密存储
- Access Token 等同 Session ID:对于 Salesforce 来说,Access Token 就是 Session ID,两者是同一个概念
- Session ID 获取方式:Session ID 由 Salesforce 登录后返回给到
- Session ID 有效期:通过成功登录后存入缓存中,设置过期时间,若是过期了,Redis 则没有 Session ID
- 用户选择登录策略:用户通过在页面上选择对应的登录策略
- 缓存刷新:Salesforce 登录成功后,刷新当前系统中对于 org 配置名称加 org 类型的缓存
- 缓存清理:过期时 Redis 自动清理,或者登出接口清除当前缓存
- OAuth2 登录支持:OAuth2 登录支持三种授权流程(password、client_credentials、authorization_code)
- OAuth2 刷新 Session:OAuth2 登录支持刷新 Session
- OAuth2 登出:OAuth2 登录支持登出操作
- Session ID 登录验证:Session ID 登录通过 Identity API 验证 Session ID 并获取用户信息
- Session ID 登出不支持刷新:Session ID 登录不支持刷新 Session
- Session ID 登出:Session ID 登录支持登出操作
- Salesforce CLI 登录:Salesforce CLI 登录使用 CLI 命令获取 Session ID
- Salesforce CLI 登出不支持刷新:Salesforce CLI 登录不支持刷新 Session
- Salesforce CLI 登出:Salesforce CLI 登录支持登出操作
- Legacy Credential 登录:Legacy Credential 登录使用遗留凭证进行登录
- Legacy Credential 登出不支持刷新:Legacy Credential 登录不支持刷新 Session
- Legacy Credential 登出:Legacy Credential 登录支持登出操作
- 会话管理:支持会话管理,会话失效时自动重新登录
- 会话有效性判断:判断会话是否有效(会话信息不为 null、登录状态为成功、Session ID 不为空、Session 未过期)
- 简化实现:先实现最简单的登录模式(OAuth2、Session ID),数据同步功能后续处理
- 历史登录快速使用:支持选择历史登录成功信息快速登录为源 org 或目标 org
- 缓存过期时间戳校验:在缓存中存储过期时间戳,使用前必须校验
- 并发登录缓存键:并发登录使用 Salesforce 用户 ID + 系统 ID 存储缓存
- 结构化缓存键设计:缓存键格式为
sf:auth:{sf_user_id}:{systemId}:{orgType},其中 sf_user_id 为 Salesforce 用户 ID(由 Salesforce 登录后返回) - 登录策略工厂模式:登录策略工厂使用工厂方法模式进行依赖注入
- 错误码映射:所有 Salesforce 错误码必须在枚举类中映射到系统错误码,提供友好的错误提示
- 错误重试机制:根据枚举类中的配置决定是否重试及重试次数
- 错误级别:支持错误级别(ERROR=错误 WARN=警告 INFO=信息)
- 可重试配置:支持是否可重试(true=可重试 false=不可重试)
- 枚举类维护:在
datai-salesforce-common模块中维护枚举类 - 登录状态查询:提供登录状态查询接口,显示所有系统的登录状态(已登录/未登录/已过期)
- 会话状态管理:支持会话状态(active/inactive)和最后活动时间管理
- 会话信息查询:支持查询最近一条活跃的会话信息
- 会话信息查询:支持根据 ORG 类型查询最近一条活跃的会话信息
- 登录历史导出:支持导出登录历史为 Excel 文件
- 登录历史分页:支持分页查询登录历史
技术约束
- Spring Boot 版本:3.5.7
- Java 版本:21
- 数据库:MySQL 8.3.0
- ORM 框架:MyBatis 3.5.16
- 缓存:Redis(使用 datai-cache-redis 模块)
- Salesforce API:使用 datai-salesforce-common 模块
- 加密工具:使用 datai-common 模块的 EncryptUtils 加密敏感信息
- 必须使用现有的认证授权机制:不能引入新的认证方式
- 策略模式:使用策略模式实现不同登录方式
- 会话管理:使用会话管理类管理会话,会话失效时自动重新登录
成功标准
- 支持配置多个 Salesforce 系统
- 支持用户自定义系统类型
- 支持策略模式登录(OAuth2、Session ID、Salesforce CLI、Legacy Credential),用户通过页面选择登录策略
- 支持区分源 org 和目标 org,支持同一系统既是源 org 又是目标 org
- 记录所有登录历史信息,包含审计信息
- 登录成功后回写 SF 返回信息到系统配置表
- 登录成功后将 SF 登录信息保存到 Redis 缓存
- 使用缓存时校验有效性(检查过期时间)
- 密码、安全令牌等敏感信息使用 EncryptUtils 加密存储
- Access Token 等同 Session ID,两者是同一个概念
- Session ID 由 Salesforce 登录后返回给到
- Session ID 的有效期通过成功登录后存入缓存中,设置过期时间,若是过期了,Redis 则没有 Session ID
- 用户通过在页面上选择对应的登录策略
- Salesforce 登录成功后,刷新当前系统中对于 org 配置名称加 org 类型的缓存
- 过期时 Redis 自动清理,或者登出接口清除当前缓存
- OAuth2 登录支持三种授权流程(password、client_credentials、authorization_code)
- OAuth2 登录支持刷新 Session
- OAuth2 登录支持登出操作
- Session ID 登录通过 Identity API 验证 Session ID 并获取用户信息
- Session ID 登录不支持刷新 Session
- Session ID 登录支持登出操作
- Salesforce CLI 登录使用 CLI 命令获取 Session ID
- Salesforce CLI 登录不支持刷新 Session
- Salesforce CLI 登录支持登出操作
- Legacy Credential 登录使用遗留凭证进行登录
- Legacy Credential 登录不支持刷新 Session
- Legacy Credential 登录支持登出操作
- 支持会话管理,会话失效时自动重新登录
- 支持获取当前 Session ID
- 支持获取当前 Instance URL
- 支持判断会话是否有效
- 支持选择历史登录成功信息快速登录为源 org 或目标 org
- 支持会话信息的增删改查
- 支持查询最近一条活跃的会话信息
- 支持根据 ORG 类型查询最近一条活跃的会话信息
- 支持会话状态(active/inactive)和最后活动时间管理
- 支持登录状态查询接口,显示所有系统的登录状态(已登录/未登录/已过期)
- 支持导出登录历史为 Excel 文件
- 支持分页查询登录历史
- 在 datai-salesforce-common 模块中生成错误码映射枚举类
- 支持错误级别(ERROR=错误 WARN=警告 INFO=信息)
- 支持是否可重试(true=可重试 false=不可重试)
- 支持建议重试次数、建议重试间隔(毫秒)
- 登录响应时间 < 3 秒
- 单元测试覆盖率 ≥ 80%
风险评估
| 风险 | 影响程度 | 发生概率 | 缓解措施 |
|---|---|---|---|
| 登录策略扩展复杂度高 | 中 | 低 | 使用策略模式,提供清晰的扩展接口 |
| 缓存失效导致性能下降 | 中 | 中 | 实现自动重新登录机制 |
| 令牌过期导致登录失败 | 中 | 中 | 实现缓存有效性校验,自动重新登录 |
| 敏感信息泄露 | 高 | 低 | 使用 EncryptUtils 加密存储敏感信息,限制访问权限 |
| 历史登录信息过期 | 中 | 中 | 实现历史登录信息有效性校验机制 |
| 缓存刷新失败 | 中 | 低 | 实现缓存刷新失败后的重试机制 |
| 缓存清理失败 | 低 | 低 | 实现缓存清理失败后的日志记录和告警 |
| 会话管理复杂度高 | 中 | 中 | 使用会话管理类封装会话逻辑,提供清晰的接口 |
| 自动登录失败 | 中 | 中 | 实现自动登录失败后的重试机制和错误提示 |
依赖关系
- 依赖 datai-salesforce-common 模块(Salesforce API、错误码映射枚举类)
- 依赖 datai-cache-redis 模块(Redis 缓存)
- 依赖 datai-common 模块(EncryptUtils 加密工具)
- 依赖现有的 Spring Boot 框架
- 依赖现有的 MyBatis 框架
- 依赖现有的认证授权机制
后续扩展
- 数据同步功能:未来实现从源 org 拉取数据并推送到目标 org
- 更多登录策略:未来支持 JWT 登录等
- 系统配置审批:未来可选支持系统配置审批流程
- 系统配置权限:未来可选支持按用户/角色控制对特定系统的访问权限
- 登录历史统计:未来支持登录成功率、失败率等统计分析
- 审计信息增强:未来支持更多审计信息(如操作日志、行为分析)
- OAuth2 PKCE 支持:未来支持 OAuth2 PKCE(Proof Key for Code Exchange)增强安全性