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 ef5335fc7..1d393fe09 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 @@ -5,6 +5,7 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthUser; @@ -15,6 +16,7 @@ import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.TenantStatus; +import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.*; import org.dromara.common.log.event.LogininforEvent; @@ -61,6 +63,24 @@ public class SysLoginService { private final ISysSocialService sysSocialService; private final SysUserMapper userMapper; + public SysUserVo loadUser(LoginType loginType, String tenantId, String account) { + return TenantHelper.dynamic(tenantId, () -> { + SysUser user = userMapper.selectOne(new LambdaQueryWrapper() + .eq(LoginType.SMS == loginType, SysUser::getPhonenumber, account) + .eq(LoginType.EMAIL == loginType, SysUser::getEmail, account) + .eq(LoginType.PASSWORD == loginType, SysUser::getUserName, account) + .eq(LoginType.SOCIAL == loginType, SysUser::getUserId, account)); + + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", account); + throw new UserException("user.not.exists", account); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", account); + throw new UserException("user.blocked", account); + } + return MapstructUtils.convert(user, SysUserVo.class); + }); + } /** * 绑定第三方用户 diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java index a2636bc22..88231cd1f 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java @@ -2,8 +2,6 @@ package org.dromara.web.service.impl; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.Constants; @@ -11,20 +9,15 @@ import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.model.EmailLoginBody; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.enums.LoginType; -import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.exception.user.CaptchaExpireException; -import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysClient; -import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysUserMapper; import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.service.IAuthStrategy; import org.dromara.web.service.SysLoginService; @@ -41,7 +34,6 @@ import org.springframework.stereotype.Service; public class EmailAuthStrategy implements IAuthStrategy { private final SysLoginService loginService; - private final SysUserMapper userMapper; @Override public LoginVo login(String body, SysClient client) { @@ -52,7 +44,7 @@ public class EmailAuthStrategy implements IAuthStrategy { String emailCode = loginBody.getEmailCode(); // 通过邮箱查找用户 - SysUserVo user = loadUserByEmail(tenantId, email); + SysUserVo user = loginService.loadUser(LoginType.EMAIL, tenantId, email); loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode)); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 @@ -87,21 +79,4 @@ public class EmailAuthStrategy implements IAuthStrategy { } return code.equals(emailCode); } - - private SysUserVo loadUserByEmail(String tenantId, String email) { - return TenantHelper.dynamic(tenantId, () -> { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getEmail, SysUser::getStatus) - .eq(SysUser::getEmail, email)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", email); - throw new UserException("user.not.exists", email); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", email); - throw new UserException("user.blocked", email); - } - return userMapper.selectUserByEmail(email); - }); - } - } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index bcb5916d3..4d1b25e25 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -3,8 +3,6 @@ package org.dromara.web.service.impl; import cn.dev33.satoken.secure.BCrypt; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.Constants; @@ -12,20 +10,16 @@ import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.PasswordLoginBody; import org.dromara.common.core.enums.LoginType; -import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.exception.user.CaptchaException; import org.dromara.common.core.exception.user.CaptchaExpireException; -import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.web.config.properties.CaptchaProperties; import org.dromara.system.domain.SysClient; -import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysUserMapper; import org.dromara.web.domain.vo.LoginVo; @@ -62,8 +56,9 @@ public class PasswordAuthStrategy implements IAuthStrategy { if (captchaEnabled) { validateCaptcha(tenantId, username, code, uuid); } + // 通过用户名查找用户 + SysUserVo user = loginService.loadUser(LoginType.PASSWORD, tenantId, username); - SysUserVo user = loadUserByUsername(tenantId, username); loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); // 此处可根据登录用户的数据不同 自行创建 loginUser LoginUser loginUser = loginService.buildLoginUser(user); @@ -106,21 +101,4 @@ public class PasswordAuthStrategy implements IAuthStrategy { throw new CaptchaException(); } } - - private SysUserVo loadUserByUsername(String tenantId, String username) { - return TenantHelper.dynamic(tenantId, () -> { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getUserName, SysUser::getStatus) - .eq(SysUser::getUserName, username)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", username); - throw new UserException("user.not.exists", username); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", username); - throw new UserException("user.blocked", username); - } - return userMapper.selectUserByUserName(username); - }); - } - } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index a4fa11c8e..5a0a307d8 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -2,8 +2,6 @@ package org.dromara.web.service.impl; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.Constants; @@ -11,20 +9,15 @@ import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.SmsLoginBody; import org.dromara.common.core.enums.LoginType; -import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.exception.user.CaptchaExpireException; -import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysClient; -import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysUserMapper; import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.service.IAuthStrategy; import org.dromara.web.service.SysLoginService; @@ -41,7 +34,6 @@ import org.springframework.stereotype.Service; public class SmsAuthStrategy implements IAuthStrategy { private final SysLoginService loginService; - private final SysUserMapper userMapper; @Override public LoginVo login(String body, SysClient client) { @@ -52,7 +44,7 @@ public class SmsAuthStrategy implements IAuthStrategy { String smsCode = loginBody.getSmsCode(); // 通过手机号查找用户 - SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber); + SysUserVo user = loginService.loadUser(LoginType.SMS, tenantId, phonenumber); loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 @@ -87,21 +79,4 @@ public class SmsAuthStrategy implements IAuthStrategy { } return code.equals(smsCode); } - - private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) { - return TenantHelper.dynamic(tenantId, () -> { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getPhonenumber, SysUser::getStatus) - .eq(SysUser::getPhonenumber, phonenumber)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", phonenumber); - throw new UserException("user.not.exists", phonenumber); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", phonenumber); - throw new UserException("user.blocked", phonenumber); - } - return userMapper.selectUserByPhonenumber(phonenumber); - }); - } - } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java index a12386e94..7647d064a 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java @@ -4,30 +4,24 @@ import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpUtil; import cn.hutool.http.Method; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.domain.model.LoginUser; import org.dromara.common.core.domain.model.SocialLoginBody; -import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.social.config.properties.SocialProperties; import org.dromara.common.social.utils.SocialUtils; -import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysClient; -import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysSocialVo; import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysSocialService; import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.service.IAuthStrategy; @@ -47,10 +41,9 @@ import java.util.Optional; @RequiredArgsConstructor public class SocialAuthStrategy implements IAuthStrategy { + private final SysLoginService loginService; private final SocialProperties socialProperties; private final ISysSocialService sysSocialService; - private final SysUserMapper userMapper; - private final SysLoginService loginService; /** * 登录-第三方授权登录 @@ -88,8 +81,8 @@ public class SocialAuthStrategy implements IAuthStrategy { throw new ServiceException("对不起,你没有权限登录当前租户!"); } SysSocialVo social = opt.get(); - // 查找用户 - SysUserVo user = loadUser(social.getTenantId(), social.getUserId()); + // 通过绑定的userId查找用户 + SysUserVo user = loginService.loadUser(LoginType.SOCIAL, social.getTenantId(), String.valueOf(social.getUserId())); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 LoginUser loginUser = loginService.buildLoginUser(user); @@ -111,21 +104,4 @@ public class SocialAuthStrategy implements IAuthStrategy { loginVo.setClientId(client.getClientId()); return loginVo; } - - private SysUserVo loadUser(String tenantId, Long userId) { - return TenantHelper.dynamic(tenantId, () -> { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getUserName, SysUser::getStatus) - .eq(SysUser::getUserId, userId)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", ""); - throw new UserException("user.not.exists", ""); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", ""); - throw new UserException("user.blocked", ""); - } - return userMapper.selectUserByUserName(user.getUserName()); - }); - } - } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java index f9cac66dc..669289823 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/LoginType.java @@ -30,7 +30,12 @@ public enum LoginType { /** * 小程序登录 */ - XCX("", ""); + XCX("", ""), + + /** + * 第三方授权登录 + */ + SOCIAL("", ""); /** * 登录重试超出限制提示