datai/docs/sessions/2026-01-21-003-02-session.md

7.8 KiB
Raw Blame History

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() 返回 falserefreshToken() 方法抛出异常

决策 4工厂方法模式的使用

时间2026-01-22 决策内容:使用工厂方法模式进行登录策略的依赖注入,避免硬编码策略选择逻辑。 决策理由

  • 符合开闭原则,对扩展开放,对修改关闭
  • 便于新增登录策略,无需修改现有代码
  • 使用 Spring 的依赖注入机制,自动注册策略实例

实施结果

  • LoginStrategyFactory使用 List 自动注入所有策略实现
  • getStrategy() 方法:根据 loginType 获取对应的策略实例
  • registerStrategy() 方法:支持运行时动态注册新策略

遇到的问题

问题 1LoginRequest 导入缺失

时间2026-01-22 问题描述:在 OAuth2PasswordLoginStrategy、OAuth2ClientCredentialsLoginStrategy、OAuth2AuthorizationCodeLoginStrategy、SessionIdLoginStrategy 中LoginRequest 类未导入。 影响范围:编译错误 解决方案

  • 在四个策略实现类中添加 import com.datai.salesforceauth.model.domain.LoginRequest;
  • 确保所有策略实现类都能正确编译

经验教训

  • 代码生成时需要检查导入语句的完整性
  • 建议使用 IDE 的自动导入功能

问题 2SalesforceApiClient 类不存在

时间2026-01-22 问题描述datai-salesforce-common 模块中没有 SalesforceApiClient 类,无法调用 Salesforce API。 影响范围:无法实现真实的 Salesforce 登录功能 解决方案

  • 在策略实现类中创建临时的 mock 方法oauth2PasswordLogin、oauth2ClientCredentialsLogin、oauth2AuthorizationCodeLogin、refreshToken、getUserInfo、logout
  • 返回 mock 数据,确保代码可以编译和运行
  • 后续需要实现真实的 SalesforceApiClient 类

经验教训

  • 需要先检查依赖的类是否存在
  • 可以使用 mock 数据进行开发,后续替换为真实实现

问题 3EncryptUtils 解密调用

时间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 调用功能,并添加测试和日志记录。

相关文档