7.8 KiB
Salesforce 策略模式登录开发会话记录
元数据
- 需求编号:2026-01-21-003-02
- 会话时间:2026-01-22
- 开发人员:SSOT 架构师
- 状态:已完成
会话概述
本次会话完成了 Salesforce 策略模式登录功能的开发,包括需求定义、方案设计、架构决策、数据库结构、提示工程、代码生成等阶段。
关键决策
决策 1:四种登录策略的实现
时间:2026-01-22 决策内容:将 OAuth2 登录拆分为三个独立的策略实现类,而不是一个统一的 OAuth2 登录策略。 决策理由:
- 每种 OAuth2 授权流程的参数和实现逻辑不同
- 拆分为独立的策略类更符合单一职责原则
- 便于后续扩展和维护
- 用户反馈:实际上应该是四种登录策略,不是两种
实施结果:
- OAuth2PasswordLoginStrategy:实现 OAuth2 Password 登录策略
- OAuth2ClientCredentialsLoginStrategy:实现 OAuth2 Client Credentials 登录策略
- OAuth2AuthorizationCodeLoginStrategy:实现 OAuth2 Authorization Code 登录策略
- SessionIdLoginStrategy:实现 Session ID 登录策略
决策 2:登录信息回写机制
时间:2026-01-22 决策内容:OAuth2 登录成功后,将登录信息回写到 datai_sf_system_config 表;Session ID 登录不回写到数据库。 决策理由:
- OAuth2 登录是系统主动发起的,需要保存登录信息供后续使用
- Session ID 登录是用户提供的临时凭证,不需要持久化
- Session ID 登录主要用于临时访问,不适合长期存储
实施结果:
- OAuth2 登录策略:登录成功后更新 datai_sf_system_config 表的 session_id、server_url、access_token、refresh_token、token_expires_at、sf_user_id、user_id、org_id、org_name 等字段
- Session ID 登录策略:登录成功后仅返回结果,不更新数据库
决策 3:刷新令牌支持
时间:2026-01-22 决策内容:OAuth2 登录策略支持刷新令牌功能,Session ID 登录策略不支持刷新令牌。 决策理由:
- OAuth2 登录返回 refresh_token,支持刷新令牌
- Session ID 登录没有 refresh_token,无法刷新
- Session ID 过期后需要重新登录
实施结果:
- OAuth2 登录策略:supportRefreshToken() 返回 true,实现 refreshToken() 方法
- Session ID 登录策略:supportRefreshToken() 返回 false,refreshToken() 方法抛出异常
决策 4:工厂方法模式的使用
时间:2026-01-22 决策内容:使用工厂方法模式进行登录策略的依赖注入,避免硬编码策略选择逻辑。 决策理由:
- 符合开闭原则,对扩展开放,对修改关闭
- 便于新增登录策略,无需修改现有代码
- 使用 Spring 的依赖注入机制,自动注册策略实例
实施结果:
- LoginStrategyFactory:使用 List 自动注入所有策略实现
- getStrategy() 方法:根据 loginType 获取对应的策略实例
- registerStrategy() 方法:支持运行时动态注册新策略
遇到的问题
问题 1:LoginRequest 导入缺失
时间:2026-01-22 问题描述:在 OAuth2PasswordLoginStrategy、OAuth2ClientCredentialsLoginStrategy、OAuth2AuthorizationCodeLoginStrategy、SessionIdLoginStrategy 中,LoginRequest 类未导入。 影响范围:编译错误 解决方案:
- 在四个策略实现类中添加
import com.datai.salesforceauth.model.domain.LoginRequest; - 确保所有策略实现类都能正确编译
经验教训:
- 代码生成时需要检查导入语句的完整性
- 建议使用 IDE 的自动导入功能
问题 2:SalesforceApiClient 类不存在
时间:2026-01-22 问题描述:datai-salesforce-common 模块中没有 SalesforceApiClient 类,无法调用 Salesforce API。 影响范围:无法实现真实的 Salesforce 登录功能 解决方案:
- 在策略实现类中创建临时的 mock 方法(oauth2PasswordLogin、oauth2ClientCredentialsLogin、oauth2AuthorizationCodeLogin、refreshToken、getUserInfo、logout)
- 返回 mock 数据,确保代码可以编译和运行
- 后续需要实现真实的 SalesforceApiClient 类
经验教训:
- 需要先检查依赖的类是否存在
- 可以使用 mock 数据进行开发,后续替换为真实实现
问题 3:EncryptUtils 解密调用
时间:2026-01-22 问题描述:根据需求文档,敏感信息(client_secret、password、security_token)需要使用 EncryptUtils 解密,但当前实现中直接使用了加密存储的值。 影响范围:无法正确登录 Salesforce 解决方案:
- 在后续实现中,需要调用 EncryptUtils.decrypt() 方法解密敏感信息
- 当前使用 mock 数据,暂时不需要解密
经验教训:
- 需要仔细阅读需求文档,确保实现符合要求
- 敏感信息处理需要特别注意
代码结构
创建的文件列表
datai-salesforce-auth
├── src/main/java/com/datai/salesforceauth/
│ ├── strategy/
│ │ ├── LoginStrategy.java
│ │ ├── OAuth2PasswordLoginStrategy.java
│ │ ├── OAuth2ClientCredentialsLoginStrategy.java
│ │ ├── OAuth2AuthorizationCodeLoginStrategy.java
│ │ ├── SessionIdLoginStrategy.java
│ │ └── LoginStrategyFactory.java
│ ├── service/
│ │ ├── ISalesforceAuthService.java
│ │ └── impl/SalesforceAuthServiceImpl.java
│ ├── controller/
│ │ └── SalesforceAuthController.java
│ ├── model/
│ │ ├── domain/
│ │ │ ├── LoginRequest.java
│ │ │ ├── LoginResult.java
│ │ │ └── UserInfo.java
│ │ ├── dto/
│ │ │ ├── OAuth2PasswordLoginRequest.java
│ │ │ ├── OAuth2ClientCredentialsLoginRequest.java
│ │ │ ├── OAuth2AuthorizationCodeLoginRequest.java
│ │ │ ├── SessionIdLoginRequest.java
│ │ │ ├── RefreshTokenRequest.java
│ │ │ └── LogoutRequest.java
│ │ └── vo/
│ │ ├── LoginResponse.java
│ │ ├── LoginTypeVo.java
│ │ └── UserInfoVo.java
│ └── exception/
│ ├── LoginException.java
│ └── RefreshTokenException.java
代码统计
- 总文件数:20 个
- 代码行数:约 800 行
- 策略类:4 个
- 服务类:2 个
- 控制器类:1 个
- 模型类:11 个
- 异常类:2 个
后续工作
待完成事项
- 实现 SalesforceApiClient 类,提供真实的 Salesforce API 调用功能
- 在策略实现类中调用 EncryptUtils.decrypt() 解密敏感信息
- 添加单元测试和集成测试
- 添加日志记录
- 添加异常处理和错误码映射
- 优化性能,考虑缓存登录信息
优化建议
- 考虑使用 Redis 缓存登录信息,减少数据库查询
- 考虑实现登录信息的自动刷新机制
- 考虑添加登录历史记录功能
- 考虑添加登录状态查询功能
总结
本次会话成功完成了 Salesforce 策略模式登录功能的开发,包括需求定义、方案设计、架构决策、数据库结构、提示工程、代码生成等阶段。代码结构清晰,符合设计模式,便于扩展和维护。后续需要实现真实的 Salesforce API 调用功能,并添加测试和日志记录。