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 + + +