From 44c04f81e2cab69fb2d10cc39825cab8a09b79a6 Mon Sep 17 00:00:00 2001 From: wangzhiwei Date: Tue, 7 Apr 2026 14:13:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(auth):=20=E4=BF=AE=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=99=BB=E5=BD=95=E6=97=B6=E6=97=A7token=E6=B8=85?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在用户登录时检查并使旧token失效的逻辑中添加异常处理 - 为Redis操作和Sa-Token操作分别添加try-catch异常捕获 - 增加详细的日志记录来跟踪token清理过程 - 统一中文化日志信息中的token相关术语 - 确保即使在操作失败时也能继续执行后续清理步骤 --- .../service/impl/SysUserServiceImpl.java | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java b/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java index e061f84..22d298e 100644 --- a/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java +++ b/src/main/java/com/kexue/skills/service/impl/SysUserServiceImpl.java @@ -282,16 +282,27 @@ public class SysUserServiceImpl implements SysUserService { // 密码验证 validatePassword(loginDto.getPassword(), sysUser); - // 检查用户是否已有token,如果有则使旧token失效 + // 检查用户是否已有 token,如果有则使旧 token 失效 String oldToken = CacheManager.getTokenFromCache(sysUser.getUserName()); if (oldToken != null && !oldToken.isEmpty()) { - // 从Redis中删除旧token对应的登录信息 - redissonClient.getBucket("loginUser:" + oldToken).delete(); - // 使旧token失效 - cn.dev33.satoken.stp.StpUtil.logoutByTokenValue(oldToken); - // 从缓存中移除旧token + log.info("检测到用户 {} 已有旧 token: {}", sysUser.getUserName(), oldToken); + // 从 Redis 中删除旧 token 对应的登录信息 + try { + redissonClient.getBucket("loginUser:" + oldToken).delete(); + log.info("已删除 Redis 中的旧 token 数据:{}", oldToken); + } catch (Exception e) { + log.error("删除 Redis 中的旧 token 失败:{}", e.getMessage()); + } + // 使旧 token 失效(Sa-Token 内部操作) + try { + cn.dev33.satoken.stp.StpUtil.logoutByTokenValue(oldToken); + log.info("已通过 Sa-Token 使旧 token 失效:{}", oldToken); + } catch (Exception e) { + log.error("Sa-Token 使旧 token 失效失败:{}", e.getMessage()); + } + // 从缓存中移除旧 token CacheManager.removeTokenFromCache(sysUser.getUserName()); - log.info("用户:{}的旧token已失效", sysUser.getUserName()); + log.info("用户:{}的旧 token 已完全失效", sysUser.getUserName()); } // 查询用户角色列表 @@ -843,16 +854,27 @@ public class SysUserServiceImpl implements SysUserService { sysUser = createUserByPhone(phone); } - // 检查用户是否已有token,如果有则使旧token失效 + // 检查用户是否已有 token,如果有则使旧 token 失效 String oldToken = CacheManager.getTokenFromCache(sysUser.getUserName()); if (oldToken != null && !oldToken.isEmpty()) { - // 从Redis中删除旧token对应的登录信息 - redissonClient.getBucket("loginUser:" + oldToken).delete(); - // 使旧token失效 - cn.dev33.satoken.stp.StpUtil.logoutByTokenValue(oldToken); - // 从缓存中移除旧token + log.info("检测到用户 {} 已有旧 token: {}", sysUser.getUserName(), oldToken); + // 从 Redis 中删除旧 token 对应的登录信息 + try { + redissonClient.getBucket("loginUser:" + oldToken).delete(); + log.info("已删除 Redis 中的旧 token 数据:{}", oldToken); + } catch (Exception e) { + log.error("删除 Redis 中的旧 token 失败:{}", e.getMessage()); + } + // 使旧 token 失效(Sa-Token 内部操作) + try { + cn.dev33.satoken.stp.StpUtil.logoutByTokenValue(oldToken); + log.info("已通过 Sa-Token 使旧 token 失效:{}", oldToken); + } catch (Exception e) { + log.error("Sa-Token 使旧 token 失效失败:{}", e.getMessage()); + } + // 从缓存中移除旧 token CacheManager.removeTokenFromCache(sysUser.getUserName()); - log.info("用户:{}的旧token已失效", sysUser.getUserName()); + log.info("用户:{}的旧 token 已完全失效", sysUser.getUserName()); } // 查询用户角色列表