datai/docs/archive/REQ-008.md

200 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: REQ-008
description: 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)
### 技术栈
- [x] Java 21/22
- [x] Spring Boot 3.x
- [x] MyBatis
- [x] Salesforce API
### 接口要求
- [x] REST API
- [ ] SOAP API
- [ ] GraphQL API
### 数据库要求
- [x] MySQL
- [ ] PostgreSQL
- [ ] Oracle
### 安全要求
- [x] BCrypt 密码哈希算法
- [x] AES-256-GCM 加密算法
- [x] 请求频率限制Rate Limiting
- [x] 日志脱敏处理
## 依赖关系 (Dependencies)
### 前置需求
- [REQ-007](./REQ-007.md) - 查询不同类型ORG登录历史及自动登录功能
### 后续需求
- [REQ-009](./REQ-009.md) - datai-salesforce-auth 模块短期优化事项待创建
### 外部依赖
- [Spring Security] - 用于请求频率限制
- [BCrypt] - 用于密码哈希
- [AES-256-GCM] - 用于敏感信息加密
## 相关文档 (Related Documents)
- [ADR 文档](../decisions/adr/0008-datai-salesforce-auth-immediate-fixes.md) - datai-salesforce-auth 模块立即修复架构决策
- [提示词文档](../prompts/008-datai-salesforce-auth-immediate-fixes.md) - datai-salesforce-auth 模块立即修复实现提示词待创建
- [模块分析报告](../retros/20260116-datai-salesforce-auth-module-analysis-retro.md) - datai-salesforce-auth 模块分析报告待创建
## 详细修复项
### 修复项 1: 语法错误修复
**位置**:
- [DataiSfLoginHistoryController.java:82](../../datai-salesforce-auth/src/main/java/com/datai/auth/controller/DataiSfLoginHistoryController.java#L82)
- [DataiSfLoginSessionController.java:82](../../datai-salesforce-auth/src/main/java/com/datai/auth/controller/DataiSfLoginSessionController.java#L82)
**问题**:
```java
return toAjax(dataiSfLoginHistoryService.insertDataiSfLoginHistory(DataiSfLoginHistoryDto.toObj(dataiSfLoginHistoryDto)));
```
存在多余的右括号 `)))`
**修复**: 移除多余的括号改为
```java
return toAjax(dataiSfLoginHistoryService.insertDataiSfLoginHistory(DataiSfLoginHistoryDto.toObj(dataiSfLoginHistoryDto)));
```
### 修复项 2: 密码加密方式调整
**位置**: [SalesforceLoginServiceImpl.java:125](../../datai-salesforce-auth/src/main/java/com/datai/auth/service/impl/SalesforceLoginServiceImpl.java#L125)
**问题**: 使用对称加密存储密码可以解密还原明文
```java
history.setPasswordEncrypted(EncryptUtils.encrypt(request.getPassword()));
```
**修复**: 使用不可逆的哈希算法 BCrypt
```java
history.setPasswordHash(BCrypt.hashpw(request.getPassword(), BCrypt.gensalt()));
```
**注意**: 需要修改数据库表结构 `password_encrypted` 字段改为 `password_hash`并调整相关代码
### 修复项 3: 敏感信息日志脱敏
**位置**: [SalesforceLoginServiceImpl.java:62](../../datai-salesforce-auth/src/main/java/com/datai/auth/service/impl/SalesforceLoginServiceImpl.java#L62)
**问题**: 日志中记录了 Session ID用户名等敏感信息
```java
logger.info("Salesforce登录成功Session ID: {}, 用户ID: {}, ORG类型: {}",
result.getSessionId(), result.getUserId(), result.getOrgType());
```
**修复**: 对敏感信息进行脱敏处理
```java
logger.info("Salesforce登录成功Session ID: {}, 用户ID: {}, ORG类型: {}",
maskSensitiveInfo(result.getSessionId()),
maskSensitiveInfo(result.getUserId()),
result.getOrgType());
```
**脱敏方法**:
```java
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](../../datai-salesforce-auth/src/main/java/com/datai/auth/controller/DataISfLoginController.java)
**问题**: 登录接口没有请求频率限制
**修复**: 添加请求频率限制使用 Spring Security Redis 实现
```java
@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 |