From b886f3a04b5b3b109cb0b1a8989f8c71e5f73d89 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期四, 01 八月 2024 23:20:29 +0800
Subject: [PATCH] fix 修复 登录错误锁定不区分租户问题
---
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java | 5 +
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java | 8 +-
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java | 5 -
ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java | 32 +++++-----
ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java | 20 ++----
ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java | 36 +++++------
ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java | 33 +++++-----
ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java | 36 +++++------
8 files changed, 80 insertions(+), 95 deletions(-)
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index af6e7f5..5280366 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -4,13 +4,14 @@
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.lock.annotation.Lock4j;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.model.AuthUser;
+import org.dromara.common.core.constant.CacheConstants;
import org.dromara.common.core.constant.Constants;
-import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
@@ -155,16 +156,11 @@
loginUser.setUserType(user.getUserType());
loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId()));
loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId()));
- TenantHelper.dynamic(user.getTenantId(), () -> {
- SysDeptVo dept = null;
- if (ObjectUtil.isNotNull(user.getDeptId())) {
- dept = deptService.selectDeptById(user.getDeptId());
- }
- loginUser.setDeptName(ObjectUtil.isNull(dept) ? "" : dept.getDeptName());
- loginUser.setDeptCategory(ObjectUtil.isNull(dept) ? "" : dept.getDeptCategory());
- List<SysRoleVo> roles = roleService.selectRolesByUserId(user.getUserId());
- loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class));
- });
+ Opt<SysDeptVo> deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById);
+ loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY));
+ loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY));
+ List<SysRoleVo> roles = roleService.selectRolesByUserId(user.getUserId());
+ loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class));
return loginUser;
}
@@ -186,7 +182,7 @@
* 鐧诲綍鏍¢獙
*/
public void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) {
- String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username;
+ String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username;
String loginFail = Constants.LOGIN_FAIL;
// 鑾峰彇鐢ㄦ埛鐧诲綍閿欒娆℃暟锛岄粯璁や负0 (鍙嚜瀹氫箟闄愬埗绛栫暐 渚嬪: key + username + ip)
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java
index 38fdc44..b5a2497 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java
@@ -21,7 +21,6 @@
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
-import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo;
@@ -51,13 +50,12 @@
String tenantId = loginBody.getTenantId();
String email = loginBody.getEmail();
String emailCode = loginBody.getEmailCode();
-
- // 閫氳繃閭鏌ユ壘鐢ㄦ埛
- SysUserVo user = loadUserByEmail(tenantId, email);
-
- loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
- // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
- LoginUser loginUser = loginService.buildLoginUser(user);
+ LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
+ SysUserVo user = loadUserByEmail(email);
+ loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
+ // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
+ return loginService.buildLoginUser(user);
+ });
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
@@ -89,18 +87,16 @@
return code.equals(emailCode);
}
- private SysUserVo loadUserByEmail(String tenantId, String email) {
- return TenantHelper.dynamic(tenantId, () -> {
- SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getEmail, email));
- if (ObjectUtil.isNull(user)) {
- log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", email);
- throw new UserException("user.not.exists", email);
- } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
- log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", email);
- throw new UserException("user.blocked", email);
- }
- return user;
- });
+ private SysUserVo loadUserByEmail(String email) {
+ SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getEmail, email));
+ if (ObjectUtil.isNull(user)) {
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", email);
+ throw new UserException("user.not.exists", email);
+ } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", email);
+ throw new UserException("user.blocked", email);
+ }
+ return user;
}
}
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
index 5d3ebd7..f28024f 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
@@ -62,11 +62,12 @@
if (captchaEnabled) {
validateCaptcha(tenantId, username, code, uuid);
}
-
- SysUserVo user = loadUserByUsername(tenantId, username);
- loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
- // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
- LoginUser loginUser = loginService.buildLoginUser(user);
+ LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
+ SysUserVo user = loadUserByUsername(username);
+ loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
+ // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
+ return loginService.buildLoginUser(user);
+ });
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
@@ -107,18 +108,16 @@
}
}
- private SysUserVo loadUserByUsername(String tenantId, String username) {
- return TenantHelper.dynamic(tenantId, () -> {
- SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, username));
- if (ObjectUtil.isNull(user)) {
- log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username);
- throw new UserException("user.not.exists", username);
- } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
- log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username);
- throw new UserException("user.blocked", username);
- }
- return user;
- });
+ private SysUserVo loadUserByUsername(String username) {
+ SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, username));
+ if (ObjectUtil.isNull(user)) {
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username);
+ throw new UserException("user.not.exists", username);
+ } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username);
+ throw new UserException("user.blocked", username);
+ }
+ return user;
}
}
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java
index f883632..89f8462 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java
@@ -21,7 +21,6 @@
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
-import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo;
@@ -51,13 +50,12 @@
String tenantId = loginBody.getTenantId();
String phonenumber = loginBody.getPhonenumber();
String smsCode = loginBody.getSmsCode();
-
- // 閫氳繃鎵嬫満鍙锋煡鎵剧敤鎴�
- SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber);
-
- loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
- // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
- LoginUser loginUser = loginService.buildLoginUser(user);
+ LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
+ SysUserVo user = loadUserByPhonenumber(phonenumber);
+ loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
+ // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
+ return loginService.buildLoginUser(user);
+ });
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
@@ -89,18 +87,16 @@
return code.equals(smsCode);
}
- private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
- return TenantHelper.dynamic(tenantId, () -> {
- SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, phonenumber));
- if (ObjectUtil.isNull(user)) {
- log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", phonenumber);
- throw new UserException("user.not.exists", phonenumber);
- } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
- log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", phonenumber);
- throw new UserException("user.blocked", phonenumber);
- }
- return user;
- });
+ private SysUserVo loadUserByPhonenumber(String phonenumber) {
+ SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, phonenumber));
+ if (ObjectUtil.isNull(user)) {
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", phonenumber);
+ throw new UserException("user.not.exists", phonenumber);
+ } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", phonenumber);
+ throw new UserException("user.blocked", phonenumber);
+ }
+ return user;
}
}
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
index 01db200..8463026 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
@@ -92,11 +92,11 @@
} else {
social = list.get(0);
}
- // 鏌ユ壘鐢ㄦ埛
- SysUserVo user = loadUser(social.getTenantId(), social.getUserId());
-
- // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
- LoginUser loginUser = loginService.buildLoginUser(user);
+ LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> {
+ SysUserVo user = loadUser(social.getUserId());
+ // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
+ return loginService.buildLoginUser(user);
+ });
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
@@ -116,18 +116,16 @@
return loginVo;
}
- private SysUserVo loadUser(String tenantId, Long userId) {
- return TenantHelper.dynamic(tenantId, () -> {
- SysUserVo user = userMapper.selectVoById(userId);
- if (ObjectUtil.isNull(user)) {
- log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", "");
- throw new UserException("user.not.exists", "");
- } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
- log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", "");
- throw new UserException("user.blocked", "");
- }
- return user;
- });
+ private SysUserVo loadUser(Long userId) {
+ SysUserVo user = userMapper.selectVoById(userId);
+ if (ObjectUtil.isNull(user)) {
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", "");
+ throw new UserException("user.not.exists", "");
+ } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+ log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", "");
+ throw new UserException("user.blocked", "");
+ }
+ return user;
}
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java
index 67bc8e4..ceb8370 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheConstants.java
@@ -22,4 +22,9 @@
*/
String SYS_DICT_KEY = "sys_dict:";
+ /**
+ * 鐧诲綍璐︽埛瀵嗙爜閿欒娆℃暟 redis key
+ */
+ String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
+
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java
index ae9bc2e..5352b11 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java
@@ -28,11 +28,6 @@
String RATE_LIMIT_KEY = GLOBAL_REDIS_KEY + "rate_limit:";
/**
- * 鐧诲綍璐︽埛瀵嗙爜閿欒娆℃暟 redis key
- */
- String PWD_ERR_CNT_KEY = GLOBAL_REDIS_KEY + "pwd_err_cnt:";
-
- /**
* 涓夋柟璁よ瘉 redis key
*/
String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:";
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java
index 18e32d8..98ac2d5 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java
@@ -1,7 +1,9 @@
package org.dromara.system.controller.monitor;
import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.dromara.common.core.constant.GlobalConstants;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.CacheConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.log.annotation.Log;
@@ -13,8 +15,6 @@
import org.dromara.system.domain.bo.SysLogininforBo;
import org.dromara.system.domain.vo.SysLogininforVo;
import org.dromara.system.service.ISysLogininforService;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -79,7 +79,7 @@
@Log(title = "璐︽埛瑙i攣", businessType = BusinessType.OTHER)
@GetMapping("/unlock/{userName}")
public R<Void> unlock(@PathVariable("userName") String userName) {
- String loginName = GlobalConstants.PWD_ERR_CNT_KEY + userName;
+ String loginName = CacheConstants.PWD_ERR_CNT_KEY + userName;
if (RedisUtils.hasKey(loginName)) {
RedisUtils.deleteObject(loginName);
}
--
Gitblit v1.9.3