Parcourir la source

update 优化 支持多租户绑定相同的三方登录

疯狂的狮子Li il y a 2 ans
Parent
commit
a7b415afcf

+ 3 - 1
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java

@@ -3,6 +3,8 @@ package org.dromara.system.api;
 import org.dromara.system.api.domain.bo.RemoteSocialBo;
 import org.dromara.system.api.domain.vo.RemoteSocialVo;
 
+import java.util.List;
+
 /**
  * 社会化关系服务
  *
@@ -13,7 +15,7 @@ public interface RemoteSocialService {
     /**
      * 根据 authId 查询用户信息
      */
-    RemoteSocialVo selectByAuthId(String authId);
+    List<RemoteSocialVo> selectByAuthId(String authId);
 
     /**
      * 保存社会化关系

+ 5 - 3
ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.exception.NotLoginException;
 import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -43,6 +44,7 @@ import org.springframework.stereotype.Service;
 
 import java.time.Duration;
 import java.util.Date;
+import java.util.List;
 import java.util.function.Supplier;
 
 /**
@@ -83,13 +85,13 @@ public class SysLoginService {
         bo.setUserName(authUserData.getUsername());
         bo.setNickName(authUserData.getNickname());
         // 查询是否已经绑定用户
-        RemoteSocialVo vo = remoteSocialService.selectByAuthId(authId);
-        if (ObjectUtil.isEmpty(vo)) {
+        List<RemoteSocialVo> list = remoteSocialService.selectByAuthId(authId);
+        if (CollUtil.isEmpty(list)) {
             // 没有绑定用户, 新增用户信息
             remoteSocialService.insertByBo(bo);
         } else {
             // 更新用户信息
-            bo.setId(vo.getId());
+            bo.setId(list.get(0).getId());
             remoteSocialService.updateByBo(bo);
         }
     }

+ 10 - 10
ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java

@@ -2,9 +2,8 @@ package org.dromara.auth.service.impl;
 
 import cn.dev33.satoken.stp.SaLoginModel;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.http.Method;
 import lombok.RequiredArgsConstructor;
@@ -29,6 +28,9 @@ import org.dromara.system.api.domain.vo.RemoteSocialVo;
 import org.dromara.system.api.model.LoginUser;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Optional;
+
 /**
  * 第三方授权策略
  *
@@ -50,7 +52,6 @@ public class SocialAuthStrategy implements IAuthStrategy {
     /**
      * 登录-第三方授权登录
      *
-     * @param clientId 客户端id
      * @param body     登录信息
      * @param client   客户端信息
      */
@@ -75,18 +76,17 @@ public class SocialAuthStrategy implements IAuthStrategy {
                 .executeAsync();
         }
 
-        RemoteSocialVo socialVo = remoteSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
-        if (!ObjectUtil.isNotNull(socialVo)) {
+        List<RemoteSocialVo> list = remoteSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
+        if (CollUtil.isEmpty(list)) {
             throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
         }
-        // 验证授权表里面的租户id是否包含当前租户id
-        String tenantId = socialVo.getTenantId();
-        if (ObjectUtil.isNotNull(socialVo) && StrUtil.isNotBlank(tenantId)
-            && !tenantId.contains(loginBody.getTenantId())) {
+        Optional<RemoteSocialVo> opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny();
+        if (opt.isEmpty()) {
             throw new ServiceException("对不起,你没有权限登录当前租户!");
         }
+        RemoteSocialVo socialVo = opt.get();
 
-        LoginUser loginUser = remoteUserService.getUserInfo(socialVo.getUserId(), tenantId);
+        LoginUser loginUser = remoteUserService.getUserInfo(socialVo.getUserId(), socialVo.getTenantId());
         loginUser.setClientKey(client.getClientKey());
         loginUser.setDeviceType(client.getDeviceType());
         SaLoginModel model = new SaLoginModel();

+ 5 - 4
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java

@@ -6,13 +6,14 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.system.api.RemoteSocialService;
 import org.dromara.system.api.domain.bo.RemoteSocialBo;
 import org.dromara.system.api.domain.vo.RemoteSocialVo;
-import org.dromara.system.domain.SysSocial;
 import org.dromara.system.domain.bo.SysSocialBo;
 import org.dromara.system.domain.vo.SysSocialVo;
 import org.dromara.system.mapper.SysSocialMapper;
 import org.dromara.system.service.ISysSocialService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 社会化关系服务
  *
@@ -30,9 +31,9 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
      * 根据 authId 查询用户信息
      */
     @Override
-    public RemoteSocialVo selectByAuthId(String authId) {
-        SysSocialVo socialVo = sysSocialService.selectByAuthId(authId);
-        return MapstructUtils.convert(socialVo, RemoteSocialVo.class);
+    public List<RemoteSocialVo> selectByAuthId(String authId) {
+        List<SysSocialVo> list = sysSocialService.selectByAuthId(authId);
+        return MapstructUtils.convert(list, RemoteSocialVo.class);
     }
 
     /**

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java

@@ -50,7 +50,7 @@ public interface ISysSocialService {
      * @param authId 认证ID
      * @return SysSocial
      */
-    SysSocialVo selectByAuthId(String authId);
+    List<SysSocialVo> selectByAuthId(String authId);
 
 
 }

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java

@@ -100,8 +100,8 @@ public class SysSocialServiceImpl implements ISysSocialService {
      * @return 授权信息
      */
     @Override
-    public SysSocialVo selectByAuthId(String authId) {
-        return baseMapper.selectVoOne(new LambdaQueryWrapper<SysSocial>().eq(SysSocial::getAuthId, authId));
+    public List<SysSocialVo> selectByAuthId(String authId) {
+        return baseMapper.selectVoList(new LambdaQueryWrapper<SysSocial>().eq(SysSocial::getAuthId, authId));
     }
 
 }