178 lines
7.8 KiB
Markdown
178 lines
7.8 KiB
Markdown
# 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<LoginStrategy> 自动注入所有策略实现
|
||
- 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 个
|
||
|
||
## 后续工作
|
||
|
||
### 待完成事项
|
||
1. 实现 SalesforceApiClient 类,提供真实的 Salesforce API 调用功能
|
||
2. 在策略实现类中调用 EncryptUtils.decrypt() 解密敏感信息
|
||
3. 添加单元测试和集成测试
|
||
4. 添加日志记录
|
||
5. 添加异常处理和错误码映射
|
||
6. 优化性能,考虑缓存登录信息
|
||
|
||
### 优化建议
|
||
1. 考虑使用 Redis 缓存登录信息,减少数据库查询
|
||
2. 考虑实现登录信息的自动刷新机制
|
||
3. 考虑添加登录历史记录功能
|
||
4. 考虑添加登录状态查询功能
|
||
|
||
## 总结
|
||
本次会话成功完成了 Salesforce 策略模式登录功能的开发,包括需求定义、方案设计、架构决策、数据库结构、提示工程、代码生成等阶段。代码结构清晰,符合设计模式,便于扩展和维护。后续需要实现真实的 Salesforce API 调用功能,并添加测试和日志记录。
|
||
|
||
## 相关文档
|
||
- [需求文档](../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/2026-01-21-003-02-salesforce-strategy-login-database.md)
|
||
- [代码生成提示词](../prompts/2026-01-21-003-02-salesforce-strategy-login代码生成提示词.md)
|