From 1ed1752f678f769e43e9faa34809701850c7f727 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期四, 30 三月 2023 19:14:38 +0800
Subject: [PATCH] update 优化 验证码有效期 迁移到数据库 参数管理内

---
 ruoyi-admin/src/main/java/com/ruoyi/web/service/SysLoginService.java |   78 +++++++++++++++++++++++++++++++++------
 1 files changed, 66 insertions(+), 12 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/service/SysLoginService.java
index fe3af8e..f51db1e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/service/SysLoginService.java
@@ -4,10 +4,12 @@
 import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.constant.Constants;
 import com.ruoyi.common.core.constant.GlobalConstants;
+import com.ruoyi.common.core.constant.TenantConstants;
 import com.ruoyi.common.core.domain.dto.RoleDTO;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.domain.model.XcxLoginUser;
@@ -29,12 +31,11 @@
 import com.ruoyi.system.domain.vo.SysTenantVo;
 import com.ruoyi.system.domain.vo.SysUserVo;
 import com.ruoyi.system.mapper.SysUserMapper;
+import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysPermissionService;
 import com.ruoyi.system.service.ISysTenantService;
-import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.time.Duration;
@@ -56,12 +57,7 @@
     private final CaptchaProperties captchaProperties;
     private final ISysPermissionService permissionService;
     private final ISysTenantService tenantService;
-
-    @Value("${user.password.maxRetryCount}")
-    private Integer maxRetryCount;
-
-    @Value("${user.password.lockTime}")
-    private Integer lockTime;
+    private final ISysConfigService configService;
 
     /**
      * 鐧诲綍楠岃瘉
@@ -73,11 +69,10 @@
      * @return 缁撴灉
      */
     public String login(String tenantId, String username, String password, String code, String uuid) {
-        HttpServletRequest request = ServletUtils.getRequest();
         boolean captchaEnabled = captchaProperties.getEnable();
         // 楠岃瘉鐮佸紑鍏�
         if (captchaEnabled) {
-            validateCaptcha(tenantId, username, code, uuid, request);
+            validateCaptcha(tenantId, username, code, uuid);
         }
         // 鏍¢獙绉熸埛
         checkTenant(tenantId);
@@ -101,6 +96,23 @@
         SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber);
 
         checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
+        // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
+        LoginUser loginUser = buildLoginUser(user);
+        // 鐢熸垚token
+        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
+
+        recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        recordLoginInfo(user.getUserId());
+        return StpUtil.getTokenValue();
+    }
+
+    public String emailLogin(String tenantId, String email, String emailCode) {
+        // 鏍¢獙绉熸埛
+        checkTenant(tenantId);
+        // 閫氳繃鎵嬫満鍙锋煡鎵剧敤鎴�
+        SysUserVo user = loadUserByEmail(tenantId, email);
+
+        checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
         // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
         LoginUser loginUser = buildLoginUser(user);
         // 鐢熸垚token
@@ -159,7 +171,6 @@
      * @param username 鐢ㄦ埛鍚�
      * @param status   鐘舵��
      * @param message  娑堟伅鍐呭
-     * @return
      */
     private void recordLogininfor(String tenantId, String username, String status, String message) {
         LogininforEvent logininforEvent = new LogininforEvent();
@@ -184,13 +195,25 @@
     }
 
     /**
+     * 鏍¢獙閭楠岃瘉鐮�
+     */
+    private boolean validateEmailCode(String tenantId, String email, String emailCode) {
+        String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email);
+        if (StringUtils.isBlank(code)) {
+            recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
+            throw new CaptchaExpireException();
+        }
+        return code.equals(emailCode);
+    }
+
+    /**
      * 鏍¢獙楠岃瘉鐮�
      *
      * @param username 鐢ㄦ埛鍚�
      * @param code     楠岃瘉鐮�
      * @param uuid     鍞竴鏍囪瘑
      */
-    public void validateCaptcha(String tenantId, String username, String code, String uuid, HttpServletRequest request) {
+    public void validateCaptcha(String tenantId, String username, String code, String uuid) {
         String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
         String captcha = RedisUtils.getCacheObject(verifyKey);
         RedisUtils.deleteObject(verifyKey);
@@ -216,6 +239,9 @@
             log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username);
             throw new UserException("user.blocked", username);
         }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByUserName(username, tenantId);
+        }
         return userMapper.selectUserByUserName(username);
     }
 
@@ -231,7 +257,28 @@
             log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", phonenumber);
             throw new UserException("user.blocked", phonenumber);
         }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByPhonenumber(phonenumber, tenantId);
+        }
         return userMapper.selectUserByPhonenumber(phonenumber);
+    }
+
+    private SysUserVo loadUserByEmail(String tenantId, String email) {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+            .select(SysUser::getPhonenumber, SysUser::getStatus)
+            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+            .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);
+        }
+        if (TenantHelper.isEnable()) {
+            return userMapper.selectTenantUserByEmail(email, tenantId);
+        }
+        return userMapper.selectUserByEmail(email);
     }
 
     private SysUserVo loadUserByOpenid(String openid) {
@@ -289,6 +336,10 @@
 
         // 鑾峰彇鐢ㄦ埛鐧诲綍閿欒娆℃暟(鍙嚜瀹氫箟闄愬埗绛栫暐 渚嬪: key + username + ip)
         Integer errorNumber = RedisUtils.getCacheObject(errorKey);
+        //瀵嗙爜鏈�澶ч敊璇鏁�
+        Integer maxRetryCount = Convert.toInt(configService.selectConfigByKey("sys.user.maxRetryCount"));
+        //瀵嗙爜閿佸畾鏃堕棿
+        Integer lockTime = Convert.toInt(configService.selectConfigByKey("sys.user.lockTime"));
         // 閿佸畾鏃堕棿鍐呯櫥褰� 鍒欒涪鍑�
         if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) {
             recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
@@ -319,6 +370,9 @@
         if (!TenantHelper.isEnable()) {
             return;
         }
+        if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
+            return;
+        }
         SysTenantVo tenant = tenantService.queryByTenantId(tenantId);
         if (ObjectUtil.isNull(tenant)) {
             log.info("鐧诲綍绉熸埛锛歿} 涓嶅瓨鍦�.", tenantId);

--
Gitblit v1.9.3