fix+refactor: 代码审查修复(11 项安全/并发缺陷)+ log.debug → log.info(21 处)
代码审查修复:
- MybatisPlusConfig: video_process_job 加入 IGNORED_TABLES(修复回调路径多租户过滤导致全部回调静默丢失)
- TokenFilter: catch(Exception) 替代 catch(NumberFormatException),防止空指针泄漏为 500
- VideoController: createJob 空指针防护 + handleCallback 共享密钥校验(X-Callback-Secret)
- VideoProcessService: handleCallback 显式校验 companyId 非空;triggerAi 失败改为 error 级日志
- ExtractionService/QaService: validateAndGetTask 显式校验 companyId(纵深防御)
- TaskClaimService: reclaim 增加原子 WHERE status='REJECTED';claim 异常时释放 Redis 锁
- TaskService: reassign 校验 targetUserId 属于同一租户
- AuthService: user:sessions:{userId} Set 设置滑动 TTL,防止 Token 无限累积
- ExportService/SourceService: RustFS + DB 非原子操作增加失败回滚清理
- SourceService: getOriginalFilename 使用 Paths.get().getFileName() 防路径遍历
日志规范:
- 11 个 Service 类 21 处 log.debug 替换为 log.info
This commit is contained in:
@@ -86,9 +86,12 @@ public class AuthService {
|
||||
redisService.hSetAll(RedisKeyManager.tokenKey(token), tokenData, tokenTtlSeconds);
|
||||
|
||||
// 将 token 加入该用户的活跃会话集合(用于角色变更时批量更新/失效)
|
||||
redisService.sAdd(RedisKeyManager.userSessionsKey(user.getId()), token);
|
||||
String sessionsKey = RedisKeyManager.userSessionsKey(user.getId());
|
||||
redisService.sAdd(sessionsKey, token);
|
||||
// 防止 Set 无限增长:TTL = token 有效期(最后一次登录时滑动续期)
|
||||
redisService.expire(sessionsKey, tokenTtlSeconds);
|
||||
|
||||
log.debug("用户登录成功: companyCode={}, username={}", request.getCompanyCode(), request.getUsername());
|
||||
log.info("用户登录成功: companyCode={}, username={}", request.getCompanyCode(), request.getUsername());
|
||||
return new LoginResponse(token, user.getId(), user.getUsername(), user.getRole(), tokenTtlSeconds);
|
||||
}
|
||||
|
||||
@@ -107,7 +110,7 @@ public class AuthService {
|
||||
redisService.sRemove(RedisKeyManager.userSessionsKey(Long.parseLong(userId)), token);
|
||||
} catch (NumberFormatException ignored) {}
|
||||
}
|
||||
log.debug("用户退出,Token 已删除: {}", token);
|
||||
log.info("用户退出,Token 已删除: {}", token);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ public class UserService {
|
||||
user.setStatus("ACTIVE");
|
||||
userMapper.insert(user);
|
||||
|
||||
log.debug("用户已创建: userId={}, username={}, role={}", user.getId(), username, role);
|
||||
log.info("用户已创建: userId={}, username={}, role={}", user.getId(), username, role);
|
||||
return user;
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ public class UserService {
|
||||
// 3. 删除权限缓存(如 Shiro 缓存存在)
|
||||
redisService.delete(RedisKeyManager.userPermKey(userId));
|
||||
|
||||
log.debug("用户角色已变更: userId={}, newRole={}, 更新 {} 个活跃 Token", userId, newRole, tokens.size());
|
||||
log.info("用户角色已变更: userId={}, newRole={}, 更新 {} 个活跃 Token", userId, newRole, tokens.size());
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------ 变更状态 --
|
||||
@@ -163,7 +163,7 @@ public class UserService {
|
||||
Set<String> tokens = redisService.sMembers(RedisKeyManager.userSessionsKey(userId));
|
||||
tokens.forEach(token -> redisService.delete(RedisKeyManager.tokenKey(token)));
|
||||
redisService.delete(RedisKeyManager.userSessionsKey(userId));
|
||||
log.debug("账号已禁用,已删除 {} 个活跃 Token: userId={}", tokens.size(), userId);
|
||||
log.info("账号已禁用,已删除 {} 个活跃 Token: userId={}", tokens.size(), userId);
|
||||
}
|
||||
|
||||
// 删除权限缓存
|
||||
|
||||
Reference in New Issue
Block a user