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

---
 ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java |   90 +++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 83 insertions(+), 7 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 689a55d..3628b05 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,11 +6,15 @@
 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;
+import me.zhyd.oauth.model.AuthUser;
 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.R;
 import org.dromara.common.core.domain.dto.RoleDTO;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.domain.model.XcxLoginUser;
@@ -29,14 +33,21 @@
 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.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.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
 import java.time.Duration;
 import java.util.Date;
 import java.util.List;
@@ -53,6 +64,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;
@@ -155,6 +168,44 @@
     }
 
     /**
+     * 绀句氦鐧诲綍
+     *
+     * @param source   鐧诲綍鏉ユ簮
+     * @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("瀵逛笉璧凤紝鎺堟潈淇℃伅楠岃瘉涓嶉�氳繃锛岃閫�鍑洪噸璇曪紒");
+        }
+        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());
+        } else {
+            // 鍒ゆ柇鏄惁宸茬櫥褰�
+            if (LoginHelper.getUserId() == null) {
+                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());
+        }
+        return R.ok(StpUtil.getTokenValue());
+    }
+
+    /**
      * 閫�鍑虹櫥褰�
      */
     public void logout() {
@@ -235,9 +286,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);
@@ -253,9 +304,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);
@@ -383,10 +434,35 @@
             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");
         }
     }
 
+
+    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