From b7c0e76da2529a7428ab15686b47214b7d621ad8 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期二, 20 六月 2023 16:50:30 +0800 Subject: [PATCH] update 优化 三方登录接口代码逻辑 --- ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java | 117 ++++++++++++++++++++++++++-------------------------------- 1 files changed, 53 insertions(+), 64 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 3628b05..52bf56c 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,7 +6,6 @@ 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; @@ -33,21 +32,18 @@ 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.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; 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.ISysSocialService; 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; -import java.io.IOException; import java.time.Duration; import java.util.Date; import java.util.List; @@ -64,8 +60,7 @@ public class SysLoginService { private final SysUserMapper userMapper; - private final ISocialUserService socialUserService; - private final ISysUserService userService; + private final ISysSocialService sysSocialService; private final CaptchaProperties captchaProperties; private final ISysPermissionService permissionService; private final ISysTenantService tenantService; @@ -172,36 +167,56 @@ * * @param source 鐧诲綍鏉ユ簮 * @param authUser 鎺堟潈鍝嶅簲瀹炰綋 - * @param request Http璇锋眰瀵硅薄 * @return 缁熶竴鍝嶅簲瀹炰綋 */ - public R<String> socialLogin(String source, AuthResponse<AuthUser> authUser, HttpServletRequest request) throws IOException { + public R<String> socialLogin(String source, AuthResponse<AuthUser> authUser) { // 鍒ゆ柇鎺堟潈鍝嶅簲鏄惁鎴愬姛 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()); + SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + if (ObjectUtil.isNotNull(social)) { + SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() + .eq(SysUser::getUserId, social.getUserId())); + // 鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣� + return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData); } else { // 鍒ゆ柇鏄惁宸茬櫥褰� - if (LoginHelper.getUserId() == null) { - return R.fail("鎺堟潈澶辫触锛岃鍏堢櫥褰曞啀缁戝畾"); + if (!StpUtil.isLogin()) { + 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()); + SysSocialBo bo = new SysSocialBo(); + bo.setUserId(LoginHelper.getUserId()); + bo.setAuthId(authUserData.getSource() + authUserData.getUuid()); + bo.setSource(authUserData.getSource()); + bo.setUserName(authUserData.getUsername()); + bo.setNickName(authUserData.getNickname()); + bo.setAvatar(authUserData.getAvatar()); + bo.setOpenId(authUserData.getUuid()); + BeanUtils.copyProperties(authUserData.getToken(), bo); + + sysSocialService.insertByBo(bo); + SysUserVo sysUser = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername()); + // 鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣� + return loginAndRecord(sysUser.getTenantId(), sysUser.getUserName(), authUserData); } + } + + /** + * 鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣� + * + * @param tenantId 绉熸埛ID + * @param userName 鐢ㄦ埛鍚� + * @param authUser 鎺堟潈鐢ㄦ埛淇℃伅 + * @return 缁熶竴鍝嶅簲瀹炰綋 + */ + private R<String> loginAndRecord(String tenantId, String userName, AuthUser authUser) { + checkTenant(tenantId); + SysUserVo user = loadUserByUsername(tenantId, userName); + LoginHelper.loginByDevice(buildLoginUser(user), DeviceType.SOCIAL); + recordLogininfor(user.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); + recordLoginInfo(user.getUserId()); return R.ok(StpUtil.getTokenValue()); } @@ -322,7 +337,7 @@ private SysUserVo loadUserByEmail(String tenantId, String email) { SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() - .select(SysUser::getPhonenumber, SysUser::getStatus) + .select(SysUser::getEmail, SysUser::getStatus) .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId) .eq(SysUser::getEmail, email)); if (ObjectUtil.isNull(user)) { @@ -391,25 +406,24 @@ String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username; String loginFail = Constants.LOGIN_FAIL; - // 鑾峰彇鐢ㄦ埛鐧诲綍閿欒娆℃暟(鍙嚜瀹氫箟闄愬埗绛栫暐 渚嬪: key + username + ip) - Integer errorNumber = RedisUtils.getCacheObject(errorKey); + // 鑾峰彇鐢ㄦ埛鐧诲綍閿欒娆℃暟锛岄粯璁や负0 (鍙嚜瀹氫箟闄愬埗绛栫暐 渚嬪: key + username + ip) + int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); // 閿佸畾鏃堕棿鍐呯櫥褰� 鍒欒涪鍑� - if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) { + if (errorNumber >= maxRetryCount) { recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); } if (supplier.get()) { - // 鏄惁绗竴娆� - errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; + // 閿欒娆℃暟閫掑 + errorNumber++; + RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); // 杈惧埌瑙勫畾閿欒娆℃暟 鍒欓攣瀹氱櫥褰� - if (errorNumber.equals(maxRetryCount)) { - RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); + if (errorNumber >= maxRetryCount) { recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); } else { - // 鏈揪鍒拌瀹氶敊璇鏁� 鍒欓�掑 - RedisUtils.setCacheObject(errorKey, errorNumber); + // 鏈揪鍒拌瀹氶敊璇鏁� recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); throw new UserException(loginType.getRetryLimitCount(), errorNumber); } @@ -440,29 +454,4 @@ } } - - 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