From f09f2d809579fc927cda876b79cc027495b313e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=B1=E5=AF=92?= Date: Thu, 12 Mar 2026 17:23:09 +0800 Subject: [PATCH] =?UTF-8?q?udp=20=E4=BD=BF=E7=94=A8=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=BC=98=E5=8C=96=E7=99=BB=E5=BD=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/AuthController.java | 13 ++++-- .../dromara/web/service/IAuthStrategy.java | 46 ------------------- .../web/strategy/AbstractAuthStrategy.java | 37 +++++++++++++++ .../org/dromara/web/strategy/AuthFactory.java | 44 ++++++++++++++++++ .../dromara/web/strategy/IAuthStrategy.java | 35 ++++++++++++++ .../impl/EmailAuthStrategy.java | 34 +++++--------- .../impl/PasswordAuthStrategy.java | 34 +++++--------- .../impl/SmsAuthStrategy.java | 35 +++++--------- .../impl/SocialAuthStrategy.java | 44 +++++++----------- .../impl/XcxAuthStrategy.java | 16 +++++-- .../dromara/common/core/enums/LoginType.java | 18 ++++++-- 11 files changed, 203 insertions(+), 153 deletions(-) delete mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/strategy/AbstractAuthStrategy.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/strategy/AuthFactory.java create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/strategy/IAuthStrategy.java rename ruoyi-admin/src/main/java/org/dromara/web/{service => strategy}/impl/EmailAuthStrategy.java (73%) rename ruoyi-admin/src/main/java/org/dromara/web/{service => strategy}/impl/PasswordAuthStrategy.java (77%) rename ruoyi-admin/src/main/java/org/dromara/web/{service => strategy}/impl/SmsAuthStrategy.java (73%) rename ruoyi-admin/src/main/java/org/dromara/web/{service => strategy}/impl/SocialAuthStrategy.java (71%) rename ruoyi-admin/src/main/java/org/dromara/web/{service => strategy}/impl/XcxAuthStrategy.java (92%) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index c448a60d3..05d48a2e0 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -18,6 +18,7 @@ import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.domain.model.RegisterBody; import org.dromara.common.core.domain.model.SocialLoginBody; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.*; import org.dromara.common.encrypt.annotation.ApiEncrypt; import org.dromara.common.json.utils.JsonUtils; @@ -40,9 +41,10 @@ import org.dromara.system.service.ISysTenantService; import org.dromara.web.domain.vo.LoginTenantVo; import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.TenantListVo; -import org.dromara.web.service.IAuthStrategy; +import org.dromara.web.strategy.IAuthStrategy; import org.dromara.web.service.SysLoginService; import org.dromara.web.service.SysRegisterService; +import org.dromara.web.strategy.AuthFactory; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -75,7 +77,7 @@ public class AuthController { private final ISysSocialService socialUserService; private final ISysClientService clientService; private final ScheduledExecutorService scheduledExecutorService; - + private final AuthFactory authFactory; /** * 登录方法 @@ -101,8 +103,13 @@ public class AuthController { } // 校验租户 loginService.checkTenant(loginBody.getTenantId()); + + IAuthStrategy authStrategy = authFactory.getLoginStrategy(grantType); + if (authStrategy == null) { + throw new ServiceException("授权类型不正确!"); + } // 登录 - LoginVo loginVo = IAuthStrategy.login(body, client, grantType); + LoginVo loginVo = authStrategy.login(body, client); Long userId = LoginHelper.getUserId(); scheduledExecutorService.schedule(() -> { diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java deleted file mode 100644 index a75b9131e..000000000 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.dromara.web.service; - - -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.system.domain.SysClient; -import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.web.domain.vo.LoginVo; - -/** - * 授权策略 - * - * @author Michelle.Chung - */ -public interface IAuthStrategy { - - String BASE_NAME = "AuthStrategy"; - - /** - * 登录 - * - * @param body 登录对象 - * @param client 授权管理视图对象 - * @param grantType 授权类型 - * @return 登录验证信息 - */ - static LoginVo login(String body, SysClientVo client, String grantType) { - // 授权类型和客户端id - String beanName = grantType + BASE_NAME; - if (!SpringUtils.containsBean(beanName)) { - throw new ServiceException("授权类型不正确!"); - } - IAuthStrategy instance = SpringUtils.getBean(beanName); - return instance.login(body, client); - } - - /** - * 登录 - * - * @param body 登录对象 - * @param client 授权管理视图对象 - * @return 登录验证信息 - */ - LoginVo login(String body, SysClientVo client); - -} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/strategy/AbstractAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/strategy/AbstractAuthStrategy.java new file mode 100644 index 000000000..9ca8259ff --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/strategy/AbstractAuthStrategy.java @@ -0,0 +1,37 @@ +package org.dromara.web.strategy; + +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.web.domain.vo.LoginVo; + +/** + * 登录策略抽象类 + * + * @author shanhan + */ +public abstract class AbstractAuthStrategy implements IAuthStrategy { + + public LoginVo loginClient(SysClientVo client, LoginUser loginUser) { + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginParameter model = new SaLoginParameter(); + model.setDeviceType(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/strategy/AuthFactory.java b/ruoyi-admin/src/main/java/org/dromara/web/strategy/AuthFactory.java new file mode 100644 index 000000000..d22ac62f1 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/strategy/AuthFactory.java @@ -0,0 +1,44 @@ +package org.dromara.web.strategy; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @description: 登录策略工厂类(工厂模式) + * @author shanhan + */ +@Component +public class AuthFactory { + + @Resource + private List authStrategyList = new ArrayList<>(); + + private final Map authStrategyMap = new HashMap<>(); + + @PostConstruct + public void init() { + for (IAuthStrategy authStrategy : authStrategyList) { + String loginType = authStrategy.loginType().getCode(); + authStrategyMap.put(loginType, authStrategy); + } + } + + /** + * 根据登录类型获取实例 + * + * @author shuai.zhou + * @date: 2023/11/17 10:53 + * @param: loginType + * @return: org.dromara.auth.strategy.IAuthStrategy + */ + public IAuthStrategy getLoginStrategy(String loginType) { + return authStrategyMap.get(loginType); + } + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/strategy/IAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/strategy/IAuthStrategy.java new file mode 100644 index 000000000..a375ce653 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/strategy/IAuthStrategy.java @@ -0,0 +1,35 @@ +package org.dromara.web.strategy; + + +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.web.domain.vo.LoginVo; + +/** + * 授权策略 + * + * @author Michelle.Chung + */ +public interface IAuthStrategy { + + String BASE_NAME = "AuthStrategy"; + + /** + * 登录 + * + * @param body 登录对象 + * @param client 授权管理视图对象 + * @return 登录验证信息 + */ + LoginVo login(String body, SysClientVo client); + + /** + * 登录类型 + * + * @return 登录类型 + */ + LoginType loginType(); + +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/EmailAuthStrategy.java similarity index 73% rename from ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java rename to ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/EmailAuthStrategy.java index e4315dc59..e8e95869b 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/EmailAuthStrategy.java @@ -1,7 +1,5 @@ -package org.dromara.web.service.impl; +package org.dromara.web.strategy.impl; -import cn.dev33.satoken.stp.StpUtil; -import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; @@ -19,26 +17,27 @@ 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.SysUser; import org.dromara.system.domain.vo.SysClientVo; 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; +import org.dromara.web.strategy.AbstractAuthStrategy; import org.springframework.stereotype.Service; +import static org.dromara.common.core.enums.LoginType.EMAIL; + /** * 邮件认证策略 * * @author Michelle.Chung */ @Slf4j -@Service("email" + IAuthStrategy.BASE_NAME) +@Service("emailAuthStrategy") @RequiredArgsConstructor -public class EmailAuthStrategy implements IAuthStrategy { +public class EmailAuthStrategy extends AbstractAuthStrategy { private final SysLoginService loginService; private final SysUserMapper userMapper; @@ -56,23 +55,12 @@ public class EmailAuthStrategy implements IAuthStrategy { // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 return loginService.buildLoginUser(user); }); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginParameter model = new SaLoginParameter(); - model.setDeviceType(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); + return loginClient(client, loginUser); + } - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; + @Override + public LoginType loginType() { + return 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/strategy/impl/PasswordAuthStrategy.java similarity index 77% rename from ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java rename to ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/PasswordAuthStrategy.java index abf590b36..4cc9258ad 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/PasswordAuthStrategy.java @@ -1,7 +1,5 @@ -package org.dromara.web.service.impl; +package org.dromara.web.strategy.impl; -import cn.dev33.satoken.stp.StpUtil; -import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.util.ObjectUtil; import cn.hutool.crypto.digest.BCrypt; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -21,7 +19,6 @@ 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.SysUser; @@ -29,19 +26,21 @@ import org.dromara.system.domain.vo.SysClientVo; 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; +import org.dromara.web.strategy.AbstractAuthStrategy; import org.springframework.stereotype.Service; +import static org.dromara.common.core.enums.LoginType.PASSWORD; + /** * 密码认证策略 * * @author Michelle.Chung */ @Slf4j -@Service("password" + IAuthStrategy.BASE_NAME) +@Service("passwordAuthStrategy") @RequiredArgsConstructor -public class PasswordAuthStrategy implements IAuthStrategy { +public class PasswordAuthStrategy extends AbstractAuthStrategy { private final CaptchaProperties captchaProperties; private final SysLoginService loginService; @@ -68,23 +67,12 @@ public class PasswordAuthStrategy implements IAuthStrategy { // 此处可根据登录用户的数据不同 自行创建 loginUser return loginService.buildLoginUser(user); }); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginParameter model = new SaLoginParameter(); - model.setDeviceType(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); + return loginClient(client, loginUser); + } - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; + @Override + public LoginType loginType() { + return PASSWORD; } /** diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/SmsAuthStrategy.java similarity index 73% rename from ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java rename to ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/SmsAuthStrategy.java index 597a6013b..70efcfcd8 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/SmsAuthStrategy.java @@ -1,7 +1,5 @@ -package org.dromara.web.service.impl; +package org.dromara.web.strategy.impl; -import cn.dev33.satoken.stp.StpUtil; -import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; @@ -19,30 +17,32 @@ 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.SysUser; import org.dromara.system.domain.vo.SysClientVo; 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; +import org.dromara.web.strategy.AbstractAuthStrategy; import org.springframework.stereotype.Service; +import static org.dromara.common.core.enums.LoginType.SMS; + /** * 短信认证策略 * * @author Michelle.Chung */ @Slf4j -@Service("sms" + IAuthStrategy.BASE_NAME) +@Service("smsAuthStrategy") @RequiredArgsConstructor -public class SmsAuthStrategy implements IAuthStrategy { +public class SmsAuthStrategy extends AbstractAuthStrategy { private final SysLoginService loginService; private final SysUserMapper userMapper; + @Override public LoginVo login(String body, SysClientVo client) { SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); @@ -56,23 +56,12 @@ public class SmsAuthStrategy implements IAuthStrategy { // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 return loginService.buildLoginUser(user); }); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginParameter model = new SaLoginParameter(); - model.setDeviceType(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); + return loginClient(client, loginUser); + } - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; + @Override + public LoginType loginType() { + return SMS; } /** diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/SocialAuthStrategy.java similarity index 71% rename from ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java rename to ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/SocialAuthStrategy.java index e01666ea6..c5065a23a 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/SocialAuthStrategy.java @@ -1,7 +1,5 @@ -package org.dromara.web.service.impl; +package org.dromara.web.strategy.impl; -import cn.dev33.satoken.stp.StpUtil; -import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; @@ -11,12 +9,12 @@ import me.zhyd.oauth.model.AuthUser; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.SocialLoginBody; +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.StreamUtils; 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; @@ -26,22 +24,25 @@ 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; import org.dromara.web.service.SysLoginService; +import org.dromara.web.strategy.AbstractAuthStrategy; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; +import static org.dromara.common.core.enums.LoginType.SOCIAL; + + /** * 第三方授权策略 * * @author thiszhc is 三三 */ @Slf4j -@Service("social" + IAuthStrategy.BASE_NAME) +@Service("socialAuthStrategy") @RequiredArgsConstructor -public class SocialAuthStrategy implements IAuthStrategy { +public class SocialAuthStrategy extends AbstractAuthStrategy { private final SocialProperties socialProperties; private final ISysSocialService sysSocialService; @@ -51,16 +52,16 @@ public class SocialAuthStrategy implements IAuthStrategy { /** * 登录-第三方授权登录 * - * @param body 登录信息 - * @param client 客户端信息 + * @param body 登录信息 + * @param client 客户端信息 */ @Override public LoginVo login(String body, SysClientVo client) { SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); ValidatorUtils.validate(loginBody); AuthResponse response = SocialUtils.loginAuth( - loginBody.getSource(), loginBody.getSocialCode(), - loginBody.getSocialState(), socialProperties); + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); if (!response.ok()) { throw new ServiceException(response.getMsg()); } @@ -85,23 +86,12 @@ public class SocialAuthStrategy implements IAuthStrategy { // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 return loginService.buildLoginUser(user); }); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginParameter model = new SaLoginParameter(); - model.setDeviceType(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); + return loginClient(client, loginUser); + } - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; + @Override + public LoginType loginType() { + return SOCIAL; } private SysUserVo loadUser(Long userId) { diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/XcxAuthStrategy.java similarity index 92% rename from ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java rename to ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/XcxAuthStrategy.java index f223dd88f..f4cc3ed93 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/strategy/impl/XcxAuthStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.web.service.impl; +package org.dromara.web.strategy.impl; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.parameter.SaLoginParameter; @@ -15,6 +15,7 @@ import me.zhyd.oauth.request.AuthWechatMiniProgramRequest; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.model.XcxLoginBody; import org.dromara.common.core.domain.model.XcxLoginUser; +import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.json.utils.JsonUtils; @@ -22,19 +23,21 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.web.domain.vo.LoginVo; -import org.dromara.web.service.IAuthStrategy; import org.dromara.web.service.SysLoginService; +import org.dromara.web.strategy.AbstractAuthStrategy; import org.springframework.stereotype.Service; +import static org.dromara.common.core.enums.LoginType.XCX; + /** * 小程序认证策略 * * @author Michelle.Chung */ @Slf4j -@Service("xcx" + IAuthStrategy.BASE_NAME) +@Service("xcxAuthStrategy") @RequiredArgsConstructor -public class XcxAuthStrategy implements IAuthStrategy { +public class XcxAuthStrategy extends AbstractAuthStrategy { private final SysLoginService loginService; @@ -94,6 +97,11 @@ public class XcxAuthStrategy implements IAuthStrategy { return loginVo; } + @Override + public LoginType loginType() { + return XCX; + } + private SysUserVo loadUserByOpenid(String openid) { // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户 // todo 自行实现 userService.selectUserByOpenid(openid); 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..6813170f8 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 @@ -15,22 +15,32 @@ public enum LoginType { /** * 密码登录 */ - PASSWORD("user.password.retry.limit.exceed", "user.password.retry.limit.count"), + PASSWORD("password", "user.password.retry.limit.exceed", "user.password.retry.limit.count"), /** * 短信登录 */ - SMS("sms.code.retry.limit.exceed", "sms.code.retry.limit.count"), + SMS("sms", "sms.code.retry.limit.exceed", "sms.code.retry.limit.count"), /** * 邮箱登录 */ - EMAIL("email.code.retry.limit.exceed", "email.code.retry.limit.count"), + EMAIL("email", "email.code.retry.limit.exceed", "email.code.retry.limit.count"), + + /** + * 第三方登录 + */ + SOCIAL("social", "", ""), /** * 小程序登录 */ - XCX("", ""); + XCX("xcx", "", ""); + + /** + * 登录策略编码 + */ + final String code; /** * 登录重试超出限制提示