From b7c0e76da2529a7428ab15686b47214b7d621ad8 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期二, 20 六月 2023 16:50:30 +0800
Subject: [PATCH] update 优化 三方登录接口代码逻辑

---
 ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java |  117 ++++++++++++++++++++++++++--------------------------------
 1 files changed, 53 insertions(+), 64 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 3628b05..52bf56c 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
@@ -6,7 +6,6 @@
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.zhyd.oauth.model.AuthResponse;
@@ -33,21 +32,18 @@
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.web.config.properties.CaptchaProperties;
 import org.dromara.system.domain.SysUser;
-import org.dromara.system.domain.bo.SocialUserBo;
-import org.dromara.system.domain.bo.SysUserBo;
-import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.system.domain.bo.SysSocialBo;
+import org.dromara.system.domain.vo.SysSocialVo;
 import org.dromara.system.domain.vo.SysTenantVo;
 import org.dromara.system.domain.vo.SysUserVo;
-import org.dromara.system.mapper.SocialUserMapper;
 import org.dromara.system.mapper.SysUserMapper;
-import org.dromara.system.service.ISocialUserService;
+import org.dromara.system.service.ISysSocialService;
 import org.dromara.system.service.ISysPermissionService;
 import org.dromara.system.service.ISysTenantService;
-import org.dromara.system.service.ISysUserService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.io.IOException;
 import java.time.Duration;
 import java.util.Date;
 import java.util.List;
@@ -64,8 +60,7 @@
 public class SysLoginService {
 
     private final SysUserMapper userMapper;
-    private final ISocialUserService socialUserService;
-    private final ISysUserService userService;
+    private final ISysSocialService sysSocialService;
     private final CaptchaProperties captchaProperties;
     private final ISysPermissionService permissionService;
     private final ISysTenantService tenantService;
@@ -172,36 +167,56 @@
      *
      * @param source   鐧诲綍鏉ユ簮
      * @param authUser 鎺堟潈鍝嶅簲瀹炰綋
-     * @param request  Http璇锋眰瀵硅薄
      * @return 缁熶竴鍝嶅簲瀹炰綋
      */
-    public R<String> socialLogin(String source, AuthResponse<AuthUser> authUser, HttpServletRequest request) throws IOException {
+    public R<String> socialLogin(String source, AuthResponse<AuthUser> authUser) {
         // 鍒ゆ柇鎺堟潈鍝嶅簲鏄惁鎴愬姛
         if (!authUser.ok()) {
             return R.fail("瀵逛笉璧凤紝鎺堟潈淇℃伅楠岃瘉涓嶉�氳繃锛岃閫�鍑洪噸璇曪紒");
         }
         AuthUser authUserData = authUser.getData();
-        // 鏌ヨ绀句氦鐢ㄦ埛淇℃伅锛屽垽鏂槸鍚﹀凡缁忕粦瀹氾紝濡傛灉宸茬粡缁戝畾鍒欑洿鎺ョ櫥褰曪紝鍚﹀垯楠岃瘉鏄惁鐧诲綍锛屾湭鐧诲綍鍒欏厛鐧诲綍鍐嶇粦瀹�
-        SocialUserVo user = socialUserService.selectSocialUserByAuthId(source + authUserData.getUuid());
-        if (ObjectUtil.isNotNull(user)) {
-            checkTenant(user.getTenantId());
-            SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
-            LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
-            recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
-            recordLoginInfo(user.getUserId());
+        SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
+        if (ObjectUtil.isNotNull(social)) {
+            SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getUserId, social.getUserId()));
+            // 鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣�
+            return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData);
         } else {
             // 鍒ゆ柇鏄惁宸茬櫥褰�
-            if (LoginHelper.getUserId() == null) {
-                return R.fail("鎺堟潈澶辫触锛岃鍏堢櫥褰曞啀缁戝畾");
+            if (!StpUtil.isLogin()) {
+                return R.fail("鎺堟潈澶辫触锛岃鍏堢櫥褰曟墠鑳界粦瀹�");
             }
-            SocialUserBo socialUserBo = new SocialUserBo();
-            socialUserService.insertByBo(setAuthUserData(authUserData, socialUserBo));
-            SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
-            checkTenant(lodingData.getTenantId());
-            LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.SOCIAL);
-            recordLogininfor(lodingData.getTenantId(), socialUserBo.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
-            recordLoginInfo(socialUserBo.getUserId());
+            SysSocialBo bo = new SysSocialBo();
+            bo.setUserId(LoginHelper.getUserId());
+            bo.setAuthId(authUserData.getSource() + authUserData.getUuid());
+            bo.setSource(authUserData.getSource());
+            bo.setUserName(authUserData.getUsername());
+            bo.setNickName(authUserData.getNickname());
+            bo.setAvatar(authUserData.getAvatar());
+            bo.setOpenId(authUserData.getUuid());
+            BeanUtils.copyProperties(authUserData.getToken(), bo);
+
+            sysSocialService.insertByBo(bo);
+            SysUserVo sysUser = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
+            // 鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣�
+            return loginAndRecord(sysUser.getTenantId(), sysUser.getUserName(), authUserData);
         }
+    }
+
+    /**
+     * 鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣�
+     *
+     * @param tenantId 绉熸埛ID
+     * @param userName 鐢ㄦ埛鍚�
+     * @param authUser 鎺堟潈鐢ㄦ埛淇℃伅
+     * @return 缁熶竴鍝嶅簲瀹炰綋
+     */
+    private R<String> loginAndRecord(String tenantId, String userName, AuthUser authUser) {
+        checkTenant(tenantId);
+        SysUserVo user = loadUserByUsername(tenantId, userName);
+        LoginHelper.loginByDevice(buildLoginUser(user), DeviceType.SOCIAL);
+        recordLogininfor(user.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        recordLoginInfo(user.getUserId());
         return R.ok(StpUtil.getTokenValue());
     }
 
@@ -322,7 +337,7 @@
 
     private SysUserVo loadUserByEmail(String tenantId, String email) {
         SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-            .select(SysUser::getPhonenumber, SysUser::getStatus)
+            .select(SysUser::getEmail, SysUser::getStatus)
             .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
             .eq(SysUser::getEmail, email));
         if (ObjectUtil.isNull(user)) {
@@ -391,25 +406,24 @@
         String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username;
         String loginFail = Constants.LOGIN_FAIL;
 
-        // 鑾峰彇鐢ㄦ埛鐧诲綍閿欒娆℃暟(鍙嚜瀹氫箟闄愬埗绛栫暐 渚嬪: key + username + ip)
-        Integer errorNumber = RedisUtils.getCacheObject(errorKey);
+        // 鑾峰彇鐢ㄦ埛鐧诲綍閿欒娆℃暟锛岄粯璁や负0 (鍙嚜瀹氫箟闄愬埗绛栫暐 渚嬪: key + username + ip)
+        int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
         // 閿佸畾鏃堕棿鍐呯櫥褰� 鍒欒涪鍑�
-        if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) {
+        if (errorNumber >= maxRetryCount) {
             recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
             throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
         }
 
         if (supplier.get()) {
-            // 鏄惁绗竴娆�
-            errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
+            // 閿欒娆℃暟閫掑
+            errorNumber++;
+            RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
             // 杈惧埌瑙勫畾閿欒娆℃暟 鍒欓攣瀹氱櫥褰�
-            if (errorNumber.equals(maxRetryCount)) {
-                RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
+            if (errorNumber >= maxRetryCount) {
                 recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
                 throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
             } else {
-                // 鏈揪鍒拌瀹氶敊璇鏁� 鍒欓�掑
-                RedisUtils.setCacheObject(errorKey, errorNumber);
+                // 鏈揪鍒拌瀹氶敊璇鏁�
                 recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
                 throw new UserException(loginType.getRetryLimitCount(), errorNumber);
             }
@@ -440,29 +454,4 @@
         }
     }
 
-
-    public SocialUserBo setAuthUserData(AuthUser authUserData, SocialUserBo socialUser) {
-        socialUser.setUserId(LoginHelper.getUserId());
-        socialUser.setAuthId(authUserData.getSource() + authUserData.getUuid());
-        socialUser.setSource(authUserData.getSource());
-        socialUser.setUserName(authUserData.getUsername());
-        socialUser.setNickName(authUserData.getNickname());
-        socialUser.setAvatar(authUserData.getAvatar());
-        socialUser.setEmail(authUserData.getEmail());
-        socialUser.setOpenId(authUserData.getUuid());
-        socialUser.setAccessToken(authUserData.getToken().getAccessToken());
-        socialUser.setExpireIn(authUserData.getToken().getExpireIn());
-        socialUser.setRefreshToken(authUserData.getToken().getRefreshToken());
-        socialUser.setAccessCode(authUserData.getToken().getAccessCode());
-        socialUser.setUnionId(authUserData.getToken().getUnionId());
-        socialUser.setScope(authUserData.getToken().getScope());
-        socialUser.setTokenType(authUserData.getToken().getTokenType());
-        socialUser.setIdToken(authUserData.getToken().getIdToken());
-        socialUser.setMacAlgorithm(authUserData.getToken().getMacAlgorithm());
-        socialUser.setMacKey(authUserData.getToken().getMacKey());
-        socialUser.setCode(authUserData.getToken().getCode());
-        socialUser.setOauthToken(authUserData.getToken().getOauthToken());
-        socialUser.setOauthTokenSecret(authUserData.getToken().getOauthTokenSecret());
-        return socialUser;
-    }
 }

--
Gitblit v1.9.3