优化第三方授权登录

This commit is contained in:
thiszhc
2023-06-15 19:30:17 +08:00
parent 5110961eb9
commit 005e7df1b8
15 changed files with 113 additions and 381 deletions

View File

@ -3,12 +3,9 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import me.zhyd.oauth.cache.AuthStateCache;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
@ -22,10 +19,8 @@ import org.dromara.common.core.domain.model.SmsLoginBody;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.social.config.SocialConfig;
import org.dromara.common.social.config.properties.ConfigProperties;
import org.dromara.common.social.config.properties.SocialLoginConfigProperties;
import org.dromara.common.social.config.properties.SocialProperties;
import org.dromara.common.social.utils.AuthRedisStateCache;
import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
@ -45,7 +40,6 @@ import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
* 认证
@ -153,7 +147,7 @@ public class AuthController {
{
return R.fail(source + "平台账号已经被账号绑定");
}
ConfigProperties obj = socialProperties.getType().get(source);
SocialLoginConfigProperties obj = socialProperties.getType().get(source);
if (ObjectUtil.isNull(obj)){
return R.fail(source + "平台账号暂不支持");
}
@ -175,7 +169,7 @@ public class AuthController {
@SuppressWarnings("unchecked")
@GetMapping("/social-login/{source}")
public R<String> socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
ConfigProperties obj = socialProperties.getType().get(source);
SocialLoginConfigProperties obj = socialProperties.getType().get(source);
if (ObjectUtil.isNull(obj)){
return R.fail(source + "平台账号暂不支持");
}

View File

@ -44,6 +44,7 @@ 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;
@ -181,27 +182,49 @@ public class SysLoginService {
return R.fail("对不起,授权信息验证不通过,请退出重试!");
}
AuthUser authUserData = authUser.getData();
// 查询社交用户信息,判断是否已经绑定,如果已经绑定则直接登录,否则验证是否登录,未登录则先登录再绑定
SocialUserVo user = socialUserService.selectSocialUserByAuthId(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.SOCIAL);
recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
recordLoginInfo(user.getUserId());
//执行登录和记录登录信息操作
return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData);
} else {
// 判断是否已登录
if (LoginHelper.getUserId() == null) {
return R.fail("授权失败,请先登录再绑定");
}
SocialUserBo socialUserBo = new SocialUserBo();
socialUserService.insertByBo(setAuthUserData(authUserData, 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.SOCIAL);
recordLogininfor(lodingData.getTenantId(), socialUserBo.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
recordLoginInfo(socialUserBo.getUserId());
//执行登录和记录登录信息操作
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());
}
@ -440,29 +463,4 @@ public class SysLoginService {
}
}
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;
}
}