From 005e7df1b8d7733b459c24104bc775c52e528454 Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: 星期四, 15 六月 2023 19:30:17 +0800
Subject: [PATCH] 优化第三方授权登录

---
 ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java |  105 ++++++++++++++++++++++++++++------------------------
 1 files changed, 57 insertions(+), 48 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 b152710..84c554d 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
@@ -32,13 +32,19 @@
 import org.dromara.common.tenant.exception.TenantException;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.web.config.properties.CaptchaProperties;
-import org.dromara.system.domain.SysAuthUser;
 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.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.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;
 
@@ -59,6 +65,8 @@
 public class SysLoginService {
 
     private final SysUserMapper userMapper;
+    private final ISocialUserService socialUserService;
+    private final ISysUserService userService;
     private final CaptchaProperties captchaProperties;
     private final ISysPermissionService permissionService;
     private final ISysTenantService tenantService;
@@ -160,64 +168,65 @@
         return StpUtil.getTokenValue();
     }
 
-
-    /**
-     * 璁よ瘉鎺堟潈鐧诲綍
-     * @param source
-     * @throws IOException
-     */
     /**
      * 绀句氦鐧诲綍
+     *
      * @param source   鐧诲綍鏉ユ簮
-     * @param authUser   鎺堟潈鍝嶅簲瀹炰綋
-     * @param request   Http璇锋眰瀵硅薄
-     * @return   缁熶竴鍝嶅簲瀹炰綋
-     * @throws IOException
+     * @param authUser 鎺堟潈鍝嶅簲瀹炰綋
+     * @param request  Http璇锋眰瀵硅薄
+     * @return 缁熶竴鍝嶅簲瀹炰綋
      */
     public R<String> socialLogin(String source, AuthResponse<AuthUser> authUser, HttpServletRequest request) throws IOException {
         // 鍒ゆ柇鎺堟潈鍝嶅簲鏄惁鎴愬姛
         if (!authUser.ok()) {
-            return R.fail("瀵逛笉璧凤紝鎺堟潈淇℃伅楠岃瘉涓嶉�氳繃锛岃鑱旂郴绠$悊鍛�");
+            return R.fail("瀵逛笉璧凤紝鎺堟潈淇℃伅楠岃瘉涓嶉�氳繃锛岃閫�鍑洪噸璇曪紒");
         }
         AuthUser authUserData = authUser.getData();
-        // 鍒ゆ柇鏁版嵁搴撲腑鏄惁宸插瓨鍦ㄨ鐢ㄦ埛
-        SysUserVo user = userMapper.selectAuthUserByUuid(source + authUserData.getUuid());
+        String authId = source + authUserData.getUuid();
+
+        SocialUserVo user = socialUserService.selectSocialUserByAuthId(authId);
         if (ObjectUtil.isNotNull(user)) {
-            checkTenant(user.getTenantId());
-            SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
-            // 鐧诲綍
-            LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.auth);
-            recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
-            recordLoginInfo(user.getUserId());
-            return R.ok(StpUtil.getTokenValue());
+            //鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣�
+            return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData);
         } else {
+            // 鍒ゆ柇鏄惁宸茬櫥褰�
             if (LoginHelper.getUserId() == null) {
                 return R.fail("鎺堟潈澶辫触锛岃鍏堢櫥褰曞啀缁戝畾");
             }
-            // 缁勮鎺堟潈鐢ㄦ埛淇℃伅
-            SysAuthUser sysAuthUser = new SysAuthUser();
-            sysAuthUser.setAvatar(authUserData.getAvatar());
-            sysAuthUser.setUuid(source + authUserData.getUuid());
-            sysAuthUser.setUserId(LoginHelper.getUserId());
-            sysAuthUser.setUserName(authUserData.getUsername());
-            sysAuthUser.setNickName(authUserData.getNickname());
-            sysAuthUser.setEmail(authUserData.getEmail());
-            sysAuthUser.setSource(source);
-            sysAuthUser.setCreateTime(new Date().toString());
-            // 鏂扮敤鎴凤紝缁戝畾绗笁鏂硅处鍙�
-            userMapper.insertAuthUser(sysAuthUser);
+            SocialUserBo socialUserBo = new SocialUserBo();
+            socialUserBo.setUserId(LoginHelper.getUserId());
+            socialUserBo.setAuthId(authUserData.getSource() + authUserData.getUuid());
+            socialUserBo.setSource(authUserData.getSource());
+            socialUserBo.setUserName(authUserData.getUsername());
+            socialUserBo.setNickName(authUserData.getNickname());
+            socialUserBo.setAvatar(authUserData.getAvatar());
+            socialUserBo.setOpenId(authUserData.getUuid());
+            BeanUtils.copyProperties(authUserData, socialUserBo);
+            BeanUtils.copyProperties(authUserData.getToken(), socialUserBo);
+
+            socialUserService.insertByBo(socialUserBo);
             SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
-            checkTenant(lodingData.getTenantId());
-            LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.auth);
-            recordLogininfor(lodingData.getTenantId(), sysAuthUser.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
-            recordLoginInfo(sysAuthUser.getUserId());
-            return R.ok(StpUtil.getTokenValue());
+            //鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣�
+            return loginAndRecord(lodingData.getTenantId(), socialUserBo.getUserName(), authUserData);
         }
     }
 
-
-
-
+    /**
+     * 鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣�
+     *
+     * @param tenantId  绉熸埛ID
+     * @param userName  鐢ㄦ埛鍚�
+     * @param authUser  鎺堟潈鐢ㄦ埛淇℃伅
+     * @return 缁熶竴鍝嶅簲瀹炰綋
+     */
+    private R<String> loginAndRecord(String tenantId, String userName, AuthUser authUser) {
+        checkTenant(tenantId);
+        SysUserVo dbUser = loadUserByUsername(tenantId, userName);
+        LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
+        recordLogininfor(dbUser.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        recordLoginInfo(dbUser.getUserId());
+        return R.ok(StpUtil.getTokenValue());
+    }
 
     /**
      * 閫�鍑虹櫥褰�
@@ -300,9 +309,9 @@
 
     private SysUserVo loadUserByUsername(String tenantId, String username) {
         SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-                .select(SysUser::getUserName, SysUser::getStatus)
-                .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
-                .eq(SysUser::getUserName, username));
+            .select(SysUser::getUserName, SysUser::getStatus)
+            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+            .eq(SysUser::getUserName, username));
         if (ObjectUtil.isNull(user)) {
             log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username);
             throw new UserException("user.not.exists", username);
@@ -318,9 +327,9 @@
 
     private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
         SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-                .select(SysUser::getPhonenumber, SysUser::getStatus)
-                .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
-                .eq(SysUser::getPhonenumber, phonenumber));
+            .select(SysUser::getPhonenumber, SysUser::getStatus)
+            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+            .eq(SysUser::getPhonenumber, phonenumber));
         if (ObjectUtil.isNull(user)) {
             log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", phonenumber);
             throw new UserException("user.not.exists", phonenumber);
@@ -448,7 +457,7 @@
             log.info("鐧诲綍绉熸埛锛歿} 宸茶鍋滅敤.", tenantId);
             throw new TenantException("tenant.blocked");
         } else if (ObjectUtil.isNotNull(tenant.getExpireTime())
-                && new Date().after(tenant.getExpireTime())) {
+            && new Date().after(tenant.getExpireTime())) {
             log.info("鐧诲綍绉熸埛锛歿} 宸茶秴杩囨湁鏁堟湡.", tenantId);
             throw new TenantException("tenant.expired");
         }

--
Gitblit v1.9.3