From 9986f31bef4bc7e0ba2d9ce2729d176a7c31de9a Mon Sep 17 00:00:00 2001 From: kongweiguang <240524885@qq.com> Date: Thu, 9 Apr 2026 14:26:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor(auth):=20=E9=87=8D=E6=9E=84=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E7=AD=96=E7=95=A5=E6=8E=A5=E5=8F=A3=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=B3=9B=E5=9E=8B=E7=B1=BB=E5=9E=8B=E5=AE=89=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 IAuthStrategy 接口改为泛型接口,提高类型安全性 - 移除手动 JSON 解析,改用 Spring 的 @Validated 注解进行参数校验 - 在 LoginBody 类上添加 Jackson 多态序列化注解配置 - 更新所有实现类的 login 方法参数类型为具体登录体类型 - 添加 jackson-annotations 依赖到json模块 --- .../org/dromara/web/controller/AuthController.java | 8 +++----- .../java/org/dromara/web/service/IAuthStrategy.java | 11 +++++------ .../dromara/web/service/impl/EmailAuthStrategy.java | 6 ++---- .../web/service/impl/PasswordAuthStrategy.java | 6 ++---- .../org/dromara/web/service/impl/SmsAuthStrategy.java | 6 ++---- .../dromara/web/service/impl/SocialAuthStrategy.java | 8 +++----- .../org/dromara/web/service/impl/XcxAuthStrategy.java | 6 ++---- ruoyi-common/ruoyi-common-core/pom.xml | 5 +++++ .../dromara/common/core/domain/model/LoginBody.java | 10 ++++++++++ 9 files changed, 34 insertions(+), 32 deletions(-) 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..d1f79a103 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 @@ -80,14 +80,12 @@ public class AuthController { /** * 登录方法 * - * @param body 登录信息 + * @param loginBody 登录信息 * @return 结果 */ @ApiEncrypt @PostMapping("/login") - public R login(@RequestBody String body) { - LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); - ValidatorUtils.validate(loginBody); + public R login(@Validated @RequestBody LoginBody loginBody) { // 授权类型和客户端id String clientId = loginBody.getClientId(); String grantType = loginBody.getGrantType(); @@ -102,7 +100,7 @@ public class AuthController { // 校验租户 loginService.checkTenant(loginBody.getTenantId()); // 登录 - LoginVo loginVo = IAuthStrategy.login(body, client, grantType); + LoginVo loginVo = IAuthStrategy.login(loginBody, client, grantType); 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 index a75b9131e..3bb7c0dd2 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java @@ -1,9 +1,8 @@ package org.dromara.web.service; - +import org.dromara.common.core.domain.model.LoginBody; 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; @@ -12,7 +11,7 @@ import org.dromara.web.domain.vo.LoginVo; * * @author Michelle.Chung */ -public interface IAuthStrategy { +public interface IAuthStrategy { String BASE_NAME = "AuthStrategy"; @@ -24,13 +23,13 @@ public interface IAuthStrategy { * @param grantType 授权类型 * @return 登录验证信息 */ - static LoginVo login(String body, SysClientVo client, String grantType) { + static LoginVo login(LoginBody body, SysClientVo client, String grantType) { // 授权类型和客户端id String beanName = grantType + BASE_NAME; if (!SpringUtils.containsBean(beanName)) { throw new ServiceException("授权类型不正确!"); } - IAuthStrategy instance = SpringUtils.getBean(beanName); + IAuthStrategy instance = SpringUtils.getBean(beanName); return instance.login(body, client); } @@ -41,6 +40,6 @@ public interface IAuthStrategy { * @param client 授权管理视图对象 * @return 登录验证信息 */ - LoginVo login(String body, SysClientVo client); + LoginVo login(T body, SysClientVo client); } 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 e4315dc59..6fcb7d588 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 @@ -17,7 +17,6 @@ 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; @@ -38,14 +37,13 @@ import org.springframework.stereotype.Service; @Slf4j @Service("email" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor -public class EmailAuthStrategy implements IAuthStrategy { +public class EmailAuthStrategy implements IAuthStrategy { private final SysLoginService loginService; private final SysUserMapper userMapper; @Override - public LoginVo login(String body, SysClientVo client) { - EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class); + public LoginVo login(EmailLoginBody loginBody, SysClientVo client) { ValidatorUtils.validate(loginBody); String tenantId = loginBody.getTenantId(); String email = loginBody.getEmail(); 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 abf590b36..c0aad8f7f 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 @@ -19,7 +19,6 @@ 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; @@ -41,15 +40,14 @@ import org.springframework.stereotype.Service; @Slf4j @Service("password" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor -public class PasswordAuthStrategy implements IAuthStrategy { +public class PasswordAuthStrategy implements IAuthStrategy { private final CaptchaProperties captchaProperties; private final SysLoginService loginService; private final SysUserMapper userMapper; @Override - public LoginVo login(String body, SysClientVo client) { - PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + public LoginVo login(PasswordLoginBody loginBody, SysClientVo client) { ValidatorUtils.validate(loginBody); String tenantId = loginBody.getTenantId(); String username = loginBody.getUsername(); 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 597a6013b..1e2860a69 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 @@ -17,7 +17,6 @@ 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; @@ -38,14 +37,13 @@ import org.springframework.stereotype.Service; @Slf4j @Service("sms" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor -public class SmsAuthStrategy implements IAuthStrategy { +public class SmsAuthStrategy implements IAuthStrategy { private final SysLoginService loginService; private final SysUserMapper userMapper; @Override - public LoginVo login(String body, SysClientVo client) { - SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); + public LoginVo login(SmsLoginBody loginBody, SysClientVo client) { ValidatorUtils.validate(loginBody); String tenantId = loginBody.getTenantId(); String phonenumber = loginBody.getPhonenumber(); 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 e01666ea6..bea711162 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 @@ -15,7 +15,6 @@ 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; @@ -41,7 +40,7 @@ import java.util.Optional; @Slf4j @Service("social" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor -public class SocialAuthStrategy implements IAuthStrategy { +public class SocialAuthStrategy implements IAuthStrategy { private final SocialProperties socialProperties; private final ISysSocialService sysSocialService; @@ -51,12 +50,11 @@ public class SocialAuthStrategy implements IAuthStrategy { /** * 登录-第三方授权登录 * - * @param body 登录信息 + * @param loginBody 登录信息 * @param client 客户端信息 */ @Override - public LoginVo login(String body, SysClientVo client) { - SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); + public LoginVo login(SocialLoginBody loginBody, SysClientVo client) { ValidatorUtils.validate(loginBody); AuthResponse response = SocialUtils.loginAuth( loginBody.getSource(), loginBody.getSocialCode(), diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java index f223dd88f..0de90ff90 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java @@ -17,7 +17,6 @@ import org.dromara.common.core.domain.model.XcxLoginBody; import org.dromara.common.core.domain.model.XcxLoginUser; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysUserVo; @@ -34,13 +33,12 @@ import org.springframework.stereotype.Service; @Slf4j @Service("xcx" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor -public class XcxAuthStrategy implements IAuthStrategy { +public class XcxAuthStrategy implements IAuthStrategy { private final SysLoginService loginService; @Override - public LoginVo login(String body, SysClientVo client) { - XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); + public LoginVo login(XcxLoginBody loginBody, SysClientVo client) { ValidatorUtils.validate(loginBody); // xcxCode 为 小程序调用 wx.login 授权后获取 String xcxCode = loginBody.getXcxCode(); diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index ad37e90db..5cbd16297 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -28,6 +28,11 @@ spring-web + + com.fasterxml.jackson.core + jackson-annotations + + org.springframework.boot diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java index 63bee0ddc..64c679667 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java @@ -1,5 +1,7 @@ package org.dromara.common.core.domain.model; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import jakarta.validation.constraints.NotBlank; import lombok.Data; @@ -13,6 +15,14 @@ import java.io.Serializable; */ @Data +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "grantType", visible = true, defaultImpl = LoginBody.class) +@JsonSubTypes({ + @JsonSubTypes.Type(value = PasswordLoginBody.class, name = "password"), + @JsonSubTypes.Type(value = SmsLoginBody.class, name = "sms"), + @JsonSubTypes.Type(value = EmailLoginBody.class, name = "email"), + @JsonSubTypes.Type(value = SocialLoginBody.class, name = "social"), + @JsonSubTypes.Type(value = XcxLoginBody.class, name = "xcx") +}) public class LoginBody implements Serializable { @Serial