diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 22c71ea0..b9d62225 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -164,15 +164,43 @@ public class AuthController { } } +// @PermitAll +// @PostMapping("/login-by-tenant") +// @Operation(summary = "登录 (切换租户之后调用)") +// public CommonResult getPhoneNumber4Login(@RequestBody @Valid TenantTokenReqVO reqVO) { +// // 强行清楚 本地线程 中的租户ID , 请设置为当前将要登录的租户ID +//// TenantContextHolder.clear(); +//// TenantContextHolder.setTenantId(Long.valueOf(reqVO.getTenantId())); +// AuthLoginRespVO login = authService.getPhoneNumber4Login(reqVO); +// if (login != null) { +// return success(login); +// } else { +// return error(405, "该手机号不是平台用户"); +// } +// } + @PermitAll + @TenantIgnore @PostMapping("/login-by-tenant") @Operation(summary = "登录 (切换租户之后调用)") - public CommonResult getPhoneNumber4Login(@RequestBody @Valid TenantTokenReqVO reqVO) { - // 强行清楚 本地线程 中的租户ID , 请设置为当前将要登录的租户ID + public CommonResult loginByTenant(@RequestBody @Valid TenantTokenReqVO reqVO) { + // 强行清除本地线程中的租户ID,设置为当前将要登录的租户ID + Long targetTenantId; + try { + targetTenantId = Long.valueOf(reqVO.getTenantId()); + } catch (NumberFormatException e) { + log.error("[loginByTenant][租户ID格式错误: {}]", reqVO.getTenantId()); + return error(400, "租户ID格式错误"); + } + + // 清除并设置租户ID,确保后续操作使用正确的租户上下文 // TenantContextHolder.clear(); -// TenantContextHolder.setTenantId(Long.valueOf(reqVO.getTenantId())); +// TenantContextHolder.setTenantId(targetTenantId); +// log.info("[loginByTenant][设置租户ID: {}, 手机号: {}]", targetTenantId, reqVO.getPhoneNumber()); + AuthLoginRespVO login = authService.getPhoneNumber4Login(reqVO); if (login != null) { + log.info("[loginByTenant][登录成功,最终租户ID: {}]", TenantContextHolder.getTenantId()); return success(login); } else { return error(405, "该手机号不是平台用户"); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index a395dcb6..e83b7075 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -451,13 +451,44 @@ public class AdminAuthServiceImpl implements AdminAuthService { } } - @Override +// @Override +// public AuthLoginRespVO getPhoneNumber4Login(TenantTokenReqVO reqVO) { +// String phoneNumber = reqVO.getPhoneNumber(); +// AdminUserDO user = userService.getUserByMobileAndTenantId2(phoneNumber,reqVO.getTenantId()); +// +// AuthLoginRespVO tokenAfterLoginSuccess = createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_MOBILE); +// tokenAfterLoginSuccess.setMobile(phoneNumber); +// return tokenAfterLoginSuccess; +// } + public AuthLoginRespVO getPhoneNumber4Login(TenantTokenReqVO reqVO) { String phoneNumber = reqVO.getPhoneNumber(); - AdminUserDO user = userService.getUserByMobileAndTenantId2(phoneNumber,reqVO.getTenantId()); + // 切换租户:强制使用请求中的租户ID,这是用户要切换到的目标租户ID + Long targetTenantId = Long.valueOf(reqVO.getTenantId()); + // 清除并设置目标租户ID,确保后续操作使用新的租户上下文 + TenantContextHolder.clear(); + TenantContextHolder.setTenantId(targetTenantId); + log.info("[getPhoneNumber4Login][切换租户登录,设置目标租户ID: {}, 手机号: {}]", targetTenantId, phoneNumber); + + // 根据手机号和目标租户ID查询用户(该租户下的用户账号) + AdminUserDO user = userService.getUserByMobileAndTenantId2(phoneNumber, reqVO.getTenantId()); + if (user == null) { + log.warn("[getPhoneNumber4Login][用户不存在,手机号: {}, 目标租户ID: {}]", phoneNumber, targetTenantId); + return null; + } + + log.info("[getPhoneNumber4Login][找到用户: {}, 用户所属租户ID: {}, 目标租户ID: {}]", + user.getId(), user.getTenantId(), targetTenantId); + + // 再次确保使用目标租户ID(防止在查询过程中被覆盖) + TenantContextHolder.setTenantId(targetTenantId); + log.info("[getPhoneNumber4Login][创建Token前,确认使用目标租户ID: {}]", TenantContextHolder.getTenantId()); + + // 创建token,确保使用目标租户ID AuthLoginRespVO tokenAfterLoginSuccess = createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_MOBILE); tokenAfterLoginSuccess.setMobile(phoneNumber); + log.info("[getPhoneNumber4Login][Token创建完成,租户ID: {}]", TenantContextHolder.getTenantId()); return tokenAfterLoginSuccess; }