From aec0e227479de49213185ff6bb98d4e99b35eb8b Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: 星期五, 16 六月 2023 20:34:23 +0800 Subject: [PATCH] Merge branch '5.X' of https://gitee.com/dromara/RuoYi-Vue-Plus into JustAuth --- ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java | 124 ++++++++++++++++++++++------------------- 1 files changed, 66 insertions(+), 58 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 b152710..479c390 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 @@ -32,13 +32,19 @@ import org.dromara.common.tenant.exception.TenantException; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.web.config.properties.CaptchaProperties; -import org.dromara.system.domain.SysAuthUser; 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.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -59,6 +65,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; @@ -160,64 +168,65 @@ return StpUtil.getTokenValue(); } - - /** - * 璁よ瘉鎺堟潈鐧诲綍 - * @param source - * @throws IOException - */ /** * 绀句氦鐧诲綍 + * * @param source 鐧诲綍鏉ユ簮 - * @param authUser 鎺堟潈鍝嶅簲瀹炰綋 - * @param request Http璇锋眰瀵硅薄 - * @return 缁熶竴鍝嶅簲瀹炰綋 - * @throws IOException + * @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("瀵逛笉璧凤紝鎺堟潈淇℃伅楠岃瘉涓嶉�氳繃锛岃鑱旂郴绠$悊鍛�"); + return R.fail("瀵逛笉璧凤紝鎺堟潈淇℃伅楠岃瘉涓嶉�氳繃锛岃閫�鍑洪噸璇曪紒"); } AuthUser authUserData = authUser.getData(); - // 鍒ゆ柇鏁版嵁搴撲腑鏄惁宸插瓨鍦ㄨ鐢ㄦ埛 - SysUserVo user = userMapper.selectAuthUserByUuid(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.auth); - recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); - recordLoginInfo(user.getUserId()); - return R.ok(StpUtil.getTokenValue()); + //鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣� + return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData); } else { + // 鍒ゆ柇鏄惁宸茬櫥褰� if (LoginHelper.getUserId() == null) { return R.fail("鎺堟潈澶辫触锛岃鍏堢櫥褰曞啀缁戝畾"); } - // 缁勮鎺堟潈鐢ㄦ埛淇℃伅 - SysAuthUser sysAuthUser = new SysAuthUser(); - sysAuthUser.setAvatar(authUserData.getAvatar()); - sysAuthUser.setUuid(source + authUserData.getUuid()); - sysAuthUser.setUserId(LoginHelper.getUserId()); - sysAuthUser.setUserName(authUserData.getUsername()); - sysAuthUser.setNickName(authUserData.getNickname()); - sysAuthUser.setEmail(authUserData.getEmail()); - sysAuthUser.setSource(source); - sysAuthUser.setCreateTime(new Date().toString()); - // 鏂扮敤鎴凤紝缁戝畾绗笁鏂硅处鍙� - userMapper.insertAuthUser(sysAuthUser); + SocialUserBo socialUserBo = new 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.auth); - recordLogininfor(lodingData.getTenantId(), sysAuthUser.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); - recordLoginInfo(sysAuthUser.getUserId()); - return R.ok(StpUtil.getTokenValue()); + //鎵ц鐧诲綍鍜岃褰曠櫥褰曚俊鎭搷浣� + 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()); + } /** * 閫�鍑虹櫥褰� @@ -300,9 +309,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); @@ -318,9 +327,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); @@ -336,7 +345,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)) { @@ -405,25 +414,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); } @@ -448,7 +456,7 @@ 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"); } -- Gitblit v1.9.3