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

This commit is contained in:
疯狂的狮子Li
2023-11-19 21:37:11 +08:00
parent 061d19426e
commit a7b415afcf
6 changed files with 26 additions and 21 deletions

View File

@@ -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);
/** /**
* 保存社会化关系 * 保存社会化关系

View File

@@ -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);
} }
} }

View File

@@ -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();

View File

@@ -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);
} }
/** /**

View File

@@ -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);
} }

View File

@@ -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));
} }
} }