200 lines
7.4 KiB
Markdown
200 lines
7.4 KiB
Markdown
---
|
||
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 |
|