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