mirror of
https://gitee.com/dromara/RuoYi-Cloud-Plus.git
synced 2025-09-08 21:37:42 +00:00
update 优化 支持多租户绑定相同的三方登录
This commit is contained in:
@@ -3,6 +3,8 @@ package org.dromara.system.api;
|
|||||||
import org.dromara.system.api.domain.bo.RemoteSocialBo;
|
import org.dromara.system.api.domain.bo.RemoteSocialBo;
|
||||||
import org.dromara.system.api.domain.vo.RemoteSocialVo;
|
import org.dromara.system.api.domain.vo.RemoteSocialVo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 社会化关系服务
|
* 社会化关系服务
|
||||||
*
|
*
|
||||||
@@ -13,7 +15,7 @@ public interface RemoteSocialService {
|
|||||||
/**
|
/**
|
||||||
* 根据 authId 查询用户信息
|
* 根据 authId 查询用户信息
|
||||||
*/
|
*/
|
||||||
RemoteSocialVo selectByAuthId(String authId);
|
List<RemoteSocialVo> selectByAuthId(String authId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存社会化关系
|
* 保存社会化关系
|
||||||
|
@@ -4,6 +4,7 @@ import cn.dev33.satoken.exception.NotLoginException;
|
|||||||
import cn.dev33.satoken.secure.BCrypt;
|
import cn.dev33.satoken.secure.BCrypt;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -43,6 +44,7 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,13 +85,13 @@ public class SysLoginService {
|
|||||||
bo.setUserName(authUserData.getUsername());
|
bo.setUserName(authUserData.getUsername());
|
||||||
bo.setNickName(authUserData.getNickname());
|
bo.setNickName(authUserData.getNickname());
|
||||||
// 查询是否已经绑定用户
|
// 查询是否已经绑定用户
|
||||||
RemoteSocialVo vo = remoteSocialService.selectByAuthId(authId);
|
List<RemoteSocialVo> list = remoteSocialService.selectByAuthId(authId);
|
||||||
if (ObjectUtil.isEmpty(vo)) {
|
if (CollUtil.isEmpty(list)) {
|
||||||
// 没有绑定用户, 新增用户信息
|
// 没有绑定用户, 新增用户信息
|
||||||
remoteSocialService.insertByBo(bo);
|
remoteSocialService.insertByBo(bo);
|
||||||
} else {
|
} else {
|
||||||
// 更新用户信息
|
// 更新用户信息
|
||||||
bo.setId(vo.getId());
|
bo.setId(list.get(0).getId());
|
||||||
remoteSocialService.updateByBo(bo);
|
remoteSocialService.updateByBo(bo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,9 +2,8 @@ package org.dromara.auth.service.impl;
|
|||||||
|
|
||||||
import cn.dev33.satoken.stp.SaLoginModel;
|
import cn.dev33.satoken.stp.SaLoginModel;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.map.MapUtil;
|
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.HttpUtil;
|
||||||
import cn.hutool.http.Method;
|
import cn.hutool.http.Method;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -29,6 +28,9 @@ import org.dromara.system.api.domain.vo.RemoteSocialVo;
|
|||||||
import org.dromara.system.api.model.LoginUser;
|
import org.dromara.system.api.model.LoginUser;
|
||||||
import org.springframework.stereotype.Service;
|
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 body 登录信息
|
||||||
* @param client 客户端信息
|
* @param client 客户端信息
|
||||||
*/
|
*/
|
||||||
@@ -75,18 +76,17 @@ public class SocialAuthStrategy implements IAuthStrategy {
|
|||||||
.executeAsync();
|
.executeAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoteSocialVo socialVo = remoteSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
|
List<RemoteSocialVo> list = remoteSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
|
||||||
if (!ObjectUtil.isNotNull(socialVo)) {
|
if (CollUtil.isEmpty(list)) {
|
||||||
throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
|
throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
|
||||||
}
|
}
|
||||||
// 验证授权表里面的租户id是否包含当前租户id
|
Optional<RemoteSocialVo> opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny();
|
||||||
String tenantId = socialVo.getTenantId();
|
if (opt.isEmpty()) {
|
||||||
if (ObjectUtil.isNotNull(socialVo) && StrUtil.isNotBlank(tenantId)
|
|
||||||
&& !tenantId.contains(loginBody.getTenantId())) {
|
|
||||||
throw new ServiceException("对不起,你没有权限登录当前租户!");
|
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.setClientKey(client.getClientKey());
|
||||||
loginUser.setDeviceType(client.getDeviceType());
|
loginUser.setDeviceType(client.getDeviceType());
|
||||||
SaLoginModel model = new SaLoginModel();
|
SaLoginModel model = new SaLoginModel();
|
||||||
|
@@ -6,13 +6,14 @@ import org.dromara.common.core.utils.MapstructUtils;
|
|||||||
import org.dromara.system.api.RemoteSocialService;
|
import org.dromara.system.api.RemoteSocialService;
|
||||||
import org.dromara.system.api.domain.bo.RemoteSocialBo;
|
import org.dromara.system.api.domain.bo.RemoteSocialBo;
|
||||||
import org.dromara.system.api.domain.vo.RemoteSocialVo;
|
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.bo.SysSocialBo;
|
||||||
import org.dromara.system.domain.vo.SysSocialVo;
|
import org.dromara.system.domain.vo.SysSocialVo;
|
||||||
import org.dromara.system.mapper.SysSocialMapper;
|
import org.dromara.system.mapper.SysSocialMapper;
|
||||||
import org.dromara.system.service.ISysSocialService;
|
import org.dromara.system.service.ISysSocialService;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 社会化关系服务
|
* 社会化关系服务
|
||||||
*
|
*
|
||||||
@@ -30,9 +31,9 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
|
|||||||
* 根据 authId 查询用户信息
|
* 根据 authId 查询用户信息
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public RemoteSocialVo selectByAuthId(String authId) {
|
public List<RemoteSocialVo> selectByAuthId(String authId) {
|
||||||
SysSocialVo socialVo = sysSocialService.selectByAuthId(authId);
|
List<SysSocialVo> list = sysSocialService.selectByAuthId(authId);
|
||||||
return MapstructUtils.convert(socialVo, RemoteSocialVo.class);
|
return MapstructUtils.convert(list, RemoteSocialVo.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -50,7 +50,7 @@ public interface ISysSocialService {
|
|||||||
* @param authId 认证ID
|
* @param authId 认证ID
|
||||||
* @return SysSocial
|
* @return SysSocial
|
||||||
*/
|
*/
|
||||||
SysSocialVo selectByAuthId(String authId);
|
List<SysSocialVo> selectByAuthId(String authId);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -100,8 +100,8 @@ public class SysSocialServiceImpl implements ISysSocialService {
|
|||||||
* @return 授权信息
|
* @return 授权信息
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public SysSocialVo selectByAuthId(String authId) {
|
public List<SysSocialVo> selectByAuthId(String authId) {
|
||||||
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysSocial>().eq(SysSocial::getAuthId, authId));
|
return baseMapper.selectVoList(new LambdaQueryWrapper<SysSocial>().eq(SysSocial::getAuthId, authId));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user