datai/docs/archive/REQ-008.md

200 lines
7.4 KiB
Markdown
Raw Permalink Normal View History

---
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 |