feat(user): 添加用户缓存更新功能

- 在用户信息更新后判断是否为当前登录用户并更新缓存
- 实现updateUserCache方法同步Redis中的LoginUser信息
- 添加token验证确保只更新当前用户的缓存
- 避免密码信息泄露通过设置pwd为null
- 添加异常处理和日志记录确保缓存更新稳定性
This commit is contained in:
wangzhiwei 2026-04-07 14:40:22 +08:00
parent 44c04f81e2
commit bd252efd20
1 changed files with 50 additions and 0 deletions

View File

@ -235,6 +235,12 @@ public class SysUserServiceImpl implements SysUserService {
// 执行更新
sysUserMapper.update(sysUser);
// 判断更新的用户是否是当前登录用户如果是则更新用户缓存
Long currentUserId = loginUserCacheUtil.getCurrentUserId();
if (currentUserId != null && currentUserId.equals(sysUserUpdateDto.getUserId())) {
updateUserCache(currentUserId, sysUser);
}
}else {
// 如果没有用户ID创建新用户
SysUser sysUser = new SysUser();
@ -1032,4 +1038,48 @@ public class SysUserServiceImpl implements SysUserService {
return sessionDto;
}
/**
* 更新用户缓存参照 currentUser 方法的逻辑
*
* @param userId 用户ID
* @param updatedUser 更新后的用户信息
*/
private void updateUserCache(Long userId, SysUser updatedUser) {
try {
// 获取当前登录用户的 token
String token = loginUserCacheUtil.getTokenFromRequest();
if (token == null || token.isEmpty()) {
log.warn("无法获取当前用户的 token跳过缓存更新");
return;
}
// Redis 中获取 LoginUser 对象
String loginUserJson = (String) redissonClient.getBucket("loginUser:" + token).get();
if (loginUserJson == null || loginUserJson.isEmpty()) {
log.warn("Redis 中未找到 LoginUser 缓存token: {}", token);
return;
}
// 解析 JSON 字符串为 LoginUser 对象
LoginUser loginUser = cn.hutool.json.JSONUtil.toBean(loginUserJson, LoginUser.class);
// 验证是否是当前用户
if (loginUser != null && loginUser.getUserInfo() != null &&
loginUser.getUserInfo().getUserId().equals(userId)) {
// 更新用户信息密码设置为 null不暴露给前端
updatedUser.setPwd(null);
loginUser.setUserInfo(updatedUser);
// 将更新后的 LoginUser 写回 Redis
redissonClient.getBucket("loginUser:" + token)
.set(cn.hutool.json.JSONUtil.toJsonStr(loginUser));
log.info("已更新用户 {} 的缓存信息", userId);
}
} catch (Exception e) {
log.error("更新用户缓存失败:{}", e.getMessage(), e);
}
}
}