datai/datai-scenes/datai-scene-salesforce/docs/requirements/REQ-008.md
Kris 469c78cf29 feat: REQ-010-1 完成数据库表结构设计和创建,REQ-010-2 完成基础实体类和Mapper创建需求定义和架构决策
REQ-010-1 完成内容:
- 创建 6 个数据库表设计(datai_meta_org_config、datai_meta_task、datai_meta_job_execution、datai_meta_component、datai_meta_deploy_history、datai_meta_job_log)
- 设计了合理的索引策略
- 对敏感字段进行了加密存储设计
- 表名前缀统一为 datai_meta_
- 所有表包含标准基础字段

REQ-010-2 完成内容:
- 补充用户故事和细化验收标准
- 创建架构决策记录(MyBatis Plus 注解 + XML 映射文件混合方案)
- 对比了 3 种备选方案
- 分析了决策对系统架构、开发流程、运维管理的影响
- 识别了技术风险、业务风险和实施风险
- 定义了回滚策略和验收标准

文档更新:
- 创建 0010-database-table-design.md 架构决策记录
- 创建 0011-entity-mapper-create.md 架构决策记录
- 创建 0020-database-table-design-create.md 变更记录
- 创建 20260117-database-table-design-create.md 会话记录
- 创建 20260117-database-table-design-create-retro.md 复盘报告
- 创建 011-database-table-design-create.md 提示词文档
- 更新 REQ-010-2.md 需求文档
- 更新 docs/index.md 和 CHANGELOG.md
2026-01-18 19:44:13 +08:00

7.4 KiB
Raw Blame History

name description
REQ-008 datai-salesforce-auth 模块立即修复事项

需求: datai-salesforce-auth 模块立即修复事项

元数据 (Metadata)

  • 需求编号: REQ-008
  • 需求标题: datai-salesforce-auth 模块立即修复事项
  • 需求类型: 非功能需求Bug 修复和安全加固)
  • 优先级: 高
  • 状态: Draft
  • 创建日期: 2026-01-16
  • 最后更新: 2026-01-16
  • 创建人: SSOT Architect
  • 负责人: 待分配

需求描述 (Description)

背景

经过对 datai-salesforce-auth 模块的详细扫描和分析,发现了多个影响系统编译、安全性和稳定性的问题。这些问题需要立即修复,以确保系统的正常运行和数据安全。

问题陈述

当前模块存在以下问题:

  1. 语法错误: DataiSfLoginHistoryController 和 DataiSfLoginSessionController 中存在多余的右括号,导致代码无法编译
  2. 密码加密不安全: 使用对称加密存储密码,可以解密还原明文,存在数据泄露风险
  3. 敏感信息日志泄露: 日志中记录了 Session ID、用户名等敏感信息存在日志泄露风险
  4. 缺少请求频率限制: 登录接口没有请求频率限制,可能遭受暴力破解攻击

目标

修复上述问题,确保系统能够正常编译运行,提高系统的安全性和稳定性。

用户故事 (User Story)

作为一个系统管理员, 我想要修复模块中的语法错误和安全漏洞, 以便于系统能够正常编译运行,并且数据安全得到保障。

验收标准 (Acceptance Criteria)

功能验收标准

  • AC1: 修复 DataiSfLoginHistoryController 中的语法错误(多余的右括号)
  • AC2: 修复 DataiSfLoginSessionController 中的语法错误(多余的右括号)
  • AC3: 代码能够正常编译,无编译错误
  • AC4: 登录功能正常工作,能够成功登录
  • AC5: 自动登录功能正常工作,能够根据历史记录自动登录
  • AC6: 添加请求频率限制,每分钟最多 5 次登录尝试

非功能验收标准

  • 性能要求: 修复后不影响登录接口响应时间,响应时间 < 2 秒
  • 安全要求: 密码使用不可逆的哈希算法(如 BCrypt或更安全的加密算法如 AES-256-GCM
  • 安全要求: 敏感信息在日志中进行脱敏处理Session ID 只显示前 8 位
  • 安全要求: 请求频率限制生效,超过限制时返回明确的错误信息
  • 可用性要求: 修复后不影响现有功能,向后兼容

测试用例

用例编号 用例描述 预期结果
TC-001 编译项目 项目能够正常编译,无编译错误
TC-002 执行登录操作 登录成功,日志中敏感信息已脱敏
TC-003 连续登录 6 次(超过频率限制) 第 6 次登录被拒绝,返回频率限制错误
TC-004 查看登录历史 密码字段已使用安全算法加密,无法直接解密
TC-005 查看日志文件 日志中 Session ID 只显示前 8 位,敏感信息已脱敏

技术要求 (Technical Requirements)

技术栈

  • Java 21/22
  • Spring Boot 3.x
  • MyBatis
  • Salesforce API

接口要求

  • REST API
  • SOAP API
  • GraphQL API

数据库要求

  • MySQL
  • PostgreSQL
  • Oracle

安全要求

  • BCrypt 密码哈希算法
  • AES-256-GCM 加密算法
  • 请求频率限制Rate Limiting
  • 日志脱敏处理

依赖关系 (Dependencies)

前置需求

  • REQ-007 - 查询不同类型ORG登录历史及自动登录功能

后续需求

  • REQ-009 - datai-salesforce-auth 模块短期优化事项(待创建)

外部依赖

  • [Spring Security] - 用于请求频率限制
  • [BCrypt] - 用于密码哈希
  • [AES-256-GCM] - 用于敏感信息加密
  • ADR 文档 - datai-salesforce-auth 模块立即修复架构决策
  • 提示词文档 - datai-salesforce-auth 模块立即修复实现提示词(待创建)
  • 模块分析报告 - datai-salesforce-auth 模块分析报告(待创建)

详细修复项

修复项 1: 语法错误修复

位置:

问题:

return toAjax(dataiSfLoginHistoryService.insertDataiSfLoginHistory(DataiSfLoginHistoryDto.toObj(dataiSfLoginHistoryDto)));

存在多余的右括号 )))

修复: 移除多余的括号,改为:

return toAjax(dataiSfLoginHistoryService.insertDataiSfLoginHistory(DataiSfLoginHistoryDto.toObj(dataiSfLoginHistoryDto)));

修复项 2: 密码加密方式调整

位置: SalesforceLoginServiceImpl.java:125

问题: 使用对称加密存储密码,可以解密还原明文

history.setPasswordEncrypted(EncryptUtils.encrypt(request.getPassword()));

修复: 使用不可逆的哈希算法(如 BCrypt

history.setPasswordHash(BCrypt.hashpw(request.getPassword(), BCrypt.gensalt()));

注意: 需要修改数据库表结构,将 password_encrypted 字段改为 password_hash,并调整相关代码。

修复项 3: 敏感信息日志脱敏

位置: SalesforceLoginServiceImpl.java:62

问题: 日志中记录了 Session ID、用户名等敏感信息

logger.info("Salesforce登录成功Session ID: {}, 用户ID: {}, ORG类型: {}", 
    result.getSessionId(), result.getUserId(), result.getOrgType());

修复: 对敏感信息进行脱敏处理

logger.info("Salesforce登录成功Session ID: {}, 用户ID: {}, ORG类型: {}", 
    maskSensitiveInfo(result.getSessionId()), 
    maskSensitiveInfo(result.getUserId()), 
    result.getOrgType());

脱敏方法:

private String maskSensitiveInfo(String info) {
    if (StringUtils.isEmpty(info)) {
        return "null";
    }
    if (info.length() <= 8) {
        return info.substring(0, 2) + "******";
    }
    return info.substring(0, 4) + "******" + info.substring(info.length() - 4);
}

修复项 4: 请求频率限制

位置: DataISfLoginController.java

问题: 登录接口没有请求频率限制

修复: 添加请求频率限制,使用 Spring Security 或 Redis 实现

@RateLimiter(value = 5, timeout = 60, timeUnit = TimeUnit.SECONDS)
@Operation(summary = "执行Salesforce登录操作源ORG")
@PostMapping("/doLogin")
public AjaxResult login(@RequestBody SalesforceLoginRequest request) {
    // 登录逻辑
}

配置: 每分钟最多 5 次登录尝试

变更历史 (Change History)

日期 版本 变更内容 变更人
2026-01-16 1.0.0 初始版本,定义立即修复事项 SSOT Architect