From 5e9dc385f5d5853b1a2ba99c11c2f299fce88174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sat, 18 Jul 2026 11:00:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E6=94=AF=E6=8C=81=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E7=99=BB=E5=BD=95=E5=8F=8A=E8=B7=A8=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在LoginParam中添加邮箱字段支持 - 新增邮箱登录接口,支持跨租户通过邮箱登录功能 - 实现根据邮箱查询所有账号接口,方便多账号选择 - 添加UserService方法支持根据邮箱查询账号 - 在UserMapper.xml中新增根据邮箱查询所有账号SQL语句 - 登录接口增加用户状态和密码校验逻辑 - 设置登录成功后Token生成及Redis缓存同步 - 处理同一邮箱多个租户账号时的租户选择逻辑 --- .../system/controller/MainController.java | 71 +++++++++++++++++++ .../common/system/mapper/xml/UserMapper.xml | 11 +++ .../common/system/param/LoginParam.java | 3 + .../common/system/service/UserService.java | 8 +++ .../system/service/impl/UserServiceImpl.java | 8 +++ 5 files changed, 101 insertions(+) diff --git a/src/main/java/com/gxwebsoft/common/system/controller/MainController.java b/src/main/java/com/gxwebsoft/common/system/controller/MainController.java index 80090b5..b868d99 100644 --- a/src/main/java/com/gxwebsoft/common/system/controller/MainController.java +++ b/src/main/java/com/gxwebsoft/common/system/controller/MainController.java @@ -237,6 +237,77 @@ public class MainController extends BaseController { return success("登录成功", new LoginResult(access_token, user)); } + @Operation(summary = "邮箱登录(支持跨租户)") + @PostMapping("/loginByEmail") + public ApiResult loginByEmail(@RequestBody LoginParam param, HttpServletRequest request) { + // 设置过期时间 + Long tokenExpireTime = configProperties.getTokenExpireTime(); + final String email = param.getEmail(); + final String password = param.getPassword(); + if (StrUtil.isBlank(email) || StrUtil.isBlank(password)) { + return fail("参数不能为空"); + } + // 跨租户:按邮箱查询所有租户下的账号 + List users = userService.findAccountsByEmail(email); + if (users == null || users.isEmpty()) { + String message = "用户不存在"; + loginRecordService.saveAsync(email, LoginRecord.TYPE_ERROR, message, null, request); + return fail(message, null); + } + User user; + if (users.size() == 1) { + user = users.get(0); + } else { + // 同一邮箱在多个租户下存在,需用户选择具体租户 + if (param.getTenantId() == null) { + User first = users.get(0); + first.setHasAdminsByPhone(true); + return success("请选择登录用户", new LoginResult(null, first)); + } + user = users.stream() + .filter(u -> u.getTenantId().equals(param.getTenantId())) + .findFirst() + .orElse(null); + if (user == null) { + return fail("用户不存在", null); + } + } + if (!user.getStatus().equals(0)) { + String message = "账号被冻结"; + loginRecordService.saveAsync(email, LoginRecord.TYPE_ERROR, message, user.getTenantId(), request); + return fail(message, null); + } + if (!userService.comparePassword(user.getPassword(), password)) { + String message = "密码错误"; + loginRecordService.saveAsync(email, LoginRecord.TYPE_ERROR, message, user.getTenantId(), request); + return fail(message, null); + } + // 登录成功 + loginRecordService.saveAsync(email, LoginRecord.TYPE_LOGIN, null, user.getTenantId(), request); + + final JSONObject register = cacheClient.getSettingInfo("register", user.getTenantId()); + if (register != null) { + final String ExpireTime = register.getString("tokenExpireTime"); + if (ExpireTime != null) { + tokenExpireTime = Long.valueOf(ExpireTime); + } + } + + // 签发token + String access_token = JwtUtil.buildToken(new JwtSubject(user.getUsername(), user.getTenantId()), + tokenExpireTime, configProperties.getTokenKey()); + // 同步redis + redisUtil.set("access_token:" + user.getUserId(), access_token, tokenExpireTime, TimeUnit.SECONDS); + return success("登录成功", new LoginResult(access_token, user)); + } + + @Operation(summary = "查询邮箱下全部账号(跨租户,用于多账号选择)") + @GetMapping("/listAdminsByEmailAll") + public ApiResult listAdminsByEmailAll(LoginParam param) { + final List accounts = userService.findAccountsByEmail(param.getEmail()); + return success(accounts); + } + @Operation(summary = "检查用户是否存在") @GetMapping("/existence") public ApiResult existence(ExistenceParam param) { diff --git a/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml b/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml index c6c8683..b56f60e 100644 --- a/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml +++ b/src/main/java/com/gxwebsoft/common/system/mapper/xml/UserMapper.xml @@ -380,6 +380,17 @@ ORDER BY a.create_time DESC + + +