Pre Merge pull request !844 from 孔皮皮/dev-login-body

This commit is contained in:
孔皮皮 2026-04-09 08:14:24 +00:00 committed by Gitee
commit ee5d2d1b76
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
9 changed files with 34 additions and 32 deletions

View File

@ -80,14 +80,12 @@ public class AuthController {
/** /**
* 登录方法 * 登录方法
* *
* @param body 登录信息 * @param loginBody 登录信息
* @return 结果 * @return 结果
*/ */
@ApiEncrypt @ApiEncrypt
@PostMapping("/login") @PostMapping("/login")
public R<LoginVo> login(@RequestBody String body) { public R<LoginVo> login(@Validated @RequestBody LoginBody loginBody) {
LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class);
ValidatorUtils.validate(loginBody);
// 授权类型和客户端id // 授权类型和客户端id
String clientId = loginBody.getClientId(); String clientId = loginBody.getClientId();
String grantType = loginBody.getGrantType(); String grantType = loginBody.getGrantType();
@ -102,7 +100,7 @@ public class AuthController {
// 校验租户 // 校验租户
loginService.checkTenant(loginBody.getTenantId()); loginService.checkTenant(loginBody.getTenantId());
// 登录 // 登录
LoginVo loginVo = IAuthStrategy.login(body, client, grantType); LoginVo loginVo = IAuthStrategy.login(loginBody, client, grantType);
Long userId = LoginHelper.getUserId(); Long userId = LoginHelper.getUserId();
scheduledExecutorService.schedule(() -> { scheduledExecutorService.schedule(() -> {

View File

@ -1,9 +1,8 @@
package org.dromara.web.service; 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.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.LoginVo;
@ -12,7 +11,7 @@ import org.dromara.web.domain.vo.LoginVo;
* *
* @author Michelle.Chung * @author Michelle.Chung
*/ */
public interface IAuthStrategy { public interface IAuthStrategy<T extends LoginBody> {
String BASE_NAME = "AuthStrategy"; String BASE_NAME = "AuthStrategy";
@ -24,13 +23,13 @@ public interface IAuthStrategy {
* @param grantType 授权类型 * @param grantType 授权类型
* @return 登录验证信息 * @return 登录验证信息
*/ */
static LoginVo login(String body, SysClientVo client, String grantType) { static LoginVo login(LoginBody body, SysClientVo client, String grantType) {
// 授权类型和客户端id // 授权类型和客户端id
String beanName = grantType + BASE_NAME; String beanName = grantType + BASE_NAME;
if (!SpringUtils.containsBean(beanName)) { if (!SpringUtils.containsBean(beanName)) {
throw new ServiceException("授权类型不正确!"); throw new ServiceException("授权类型不正确!");
} }
IAuthStrategy instance = SpringUtils.getBean(beanName); IAuthStrategy<LoginBody> instance = SpringUtils.getBean(beanName);
return instance.login(body, client); return instance.login(body, client);
} }
@ -41,6 +40,6 @@ public interface IAuthStrategy {
* @param client 授权管理视图对象 * @param client 授权管理视图对象
* @return 登录验证信息 * @return 登录验证信息
*/ */
LoginVo login(String body, SysClientVo client); LoginVo login(T body, SysClientVo client);
} }

View File

@ -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.MessageUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ValidatorUtils; 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.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
@ -38,14 +37,13 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
@Service("email" + IAuthStrategy.BASE_NAME) @Service("email" + IAuthStrategy.BASE_NAME)
@RequiredArgsConstructor @RequiredArgsConstructor
public class EmailAuthStrategy implements IAuthStrategy { public class EmailAuthStrategy implements IAuthStrategy<EmailLoginBody> {
private final SysLoginService loginService; private final SysLoginService loginService;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@Override @Override
public LoginVo login(String body, SysClientVo client) { public LoginVo login(EmailLoginBody loginBody, SysClientVo client) {
EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
String email = loginBody.getEmail(); String email = loginBody.getEmail();

View File

@ -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.MessageUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ValidatorUtils; 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.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
@ -41,15 +40,14 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
@Service("password" + IAuthStrategy.BASE_NAME) @Service("password" + IAuthStrategy.BASE_NAME)
@RequiredArgsConstructor @RequiredArgsConstructor
public class PasswordAuthStrategy implements IAuthStrategy { public class PasswordAuthStrategy implements IAuthStrategy<PasswordLoginBody> {
private final CaptchaProperties captchaProperties; private final CaptchaProperties captchaProperties;
private final SysLoginService loginService; private final SysLoginService loginService;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@Override @Override
public LoginVo login(String body, SysClientVo client) { public LoginVo login(PasswordLoginBody loginBody, SysClientVo client) {
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
String username = loginBody.getUsername(); String username = loginBody.getUsername();

View File

@ -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.MessageUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ValidatorUtils; 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.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
@ -38,14 +37,13 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
@Service("sms" + IAuthStrategy.BASE_NAME) @Service("sms" + IAuthStrategy.BASE_NAME)
@RequiredArgsConstructor @RequiredArgsConstructor
public class SmsAuthStrategy implements IAuthStrategy { public class SmsAuthStrategy implements IAuthStrategy<SmsLoginBody> {
private final SysLoginService loginService; private final SysLoginService loginService;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@Override @Override
public LoginVo login(String body, SysClientVo client) { public LoginVo login(SmsLoginBody loginBody, SysClientVo client) {
SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
String phonenumber = loginBody.getPhonenumber(); String phonenumber = loginBody.getPhonenumber();

View File

@ -15,7 +15,6 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.ValidatorUtils; 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.satoken.utils.LoginHelper;
import org.dromara.common.social.config.properties.SocialProperties; import org.dromara.common.social.config.properties.SocialProperties;
import org.dromara.common.social.utils.SocialUtils; import org.dromara.common.social.utils.SocialUtils;
@ -41,7 +40,7 @@ import java.util.Optional;
@Slf4j @Slf4j
@Service("social" + IAuthStrategy.BASE_NAME) @Service("social" + IAuthStrategy.BASE_NAME)
@RequiredArgsConstructor @RequiredArgsConstructor
public class SocialAuthStrategy implements IAuthStrategy { public class SocialAuthStrategy implements IAuthStrategy<SocialLoginBody> {
private final SocialProperties socialProperties; private final SocialProperties socialProperties;
private final ISysSocialService sysSocialService; private final ISysSocialService sysSocialService;
@ -51,12 +50,11 @@ public class SocialAuthStrategy implements IAuthStrategy {
/** /**
* 登录-第三方授权登录 * 登录-第三方授权登录
* *
* @param body 登录信息 * @param loginBody 登录信息
* @param client 客户端信息 * @param client 客户端信息
*/ */
@Override @Override
public LoginVo login(String body, SysClientVo client) { public LoginVo login(SocialLoginBody loginBody, SysClientVo client) {
SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
AuthResponse<AuthUser> response = SocialUtils.loginAuth( AuthResponse<AuthUser> response = SocialUtils.loginAuth(
loginBody.getSource(), loginBody.getSocialCode(), loginBody.getSource(), loginBody.getSocialCode(),

View File

@ -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.domain.model.XcxLoginUser;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.ValidatorUtils; 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.satoken.utils.LoginHelper;
import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
@ -34,13 +33,12 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
@Service("xcx" + IAuthStrategy.BASE_NAME) @Service("xcx" + IAuthStrategy.BASE_NAME)
@RequiredArgsConstructor @RequiredArgsConstructor
public class XcxAuthStrategy implements IAuthStrategy { public class XcxAuthStrategy implements IAuthStrategy<XcxLoginBody> {
private final SysLoginService loginService; private final SysLoginService loginService;
@Override @Override
public LoginVo login(String body, SysClientVo client) { public LoginVo login(XcxLoginBody loginBody, SysClientVo client) {
XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
// xcxCode 小程序调用 wx.login 授权后获取 // xcxCode 小程序调用 wx.login 授权后获取
String xcxCode = loginBody.getXcxCode(); String xcxCode = loginBody.getXcxCode();

View File

@ -28,6 +28,11 @@
<artifactId>spring-web</artifactId> <artifactId>spring-web</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<!-- 自定义验证注解 --> <!-- 自定义验证注解 -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -1,5 +1,7 @@
package org.dromara.common.core.domain.model; 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 jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
@ -13,6 +15,14 @@ import java.io.Serializable;
*/ */
@Data @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 { public class LoginBody implements Serializable {
@Serial @Serial