From a730c46a8c2bdc9dd17a0444636b3955c8fe1c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=8B=E9=81=93=E6=BA=90=E7=A0=81?= Date: Thu, 26 Sep 2024 12:49:54 +0800 Subject: [PATCH] Add email and password login --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/YunaiV/ruoyi-vue-pro?shareId=XXXX-XXXX-XXXX-XXXX). --- .../controller/admin/auth/AuthController.java | 11 +++++- .../admin/auth/vo/AuthLoginReqVO.java | 8 ++++- .../admin/auth/vo/AuthLoginRespVO.java | 3 ++ .../system/service/auth/AdminAuthService.java | 8 +++++ .../service/auth/AdminAuthServiceImpl.java | 35 +++++++++++++++++-- 5 files changed, 60 insertions(+), 5 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index 2128ebe8ad..13acff8a1f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -92,7 +92,7 @@ public class AuthController { @GetMapping("/get-permission-info") @Operation(summary = "获取登录用户的权限信息") public CommonResult getPermissionInfo() { - // 1.1 获得用户信息 + // 1.1 � AdminUserDO user = userService.getUser(getLoginUserId()); if (user == null) { return success(null); @@ -154,4 +154,13 @@ public class AuthController { return success(authService.socialLogin(reqVO)); } + // ========== 邮箱登录相关 ========== + + @PostMapping("/email-login") + @PermitAll + @Operation(summary = "使用邮箱和密码登录") + public CommonResult emailLogin(@RequestBody @Valid AuthEmailLoginReqVO reqVO) { + return success(authService.emailLogin(reqVO)); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginReqVO.java index 2009a9e44f..19bd69fad8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginReqVO.java @@ -11,6 +11,7 @@ import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.Email; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; @@ -32,6 +33,11 @@ public class AuthLoginReqVO { @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String password; + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "example@example.com") + @NotEmpty(message = "邮箱不能为空") + @Email(message = "邮箱格式不正确") + private String email; + // ========== 图片验证码相关 ========== @Schema(description = "验证码,验证码开启时,需要传递", requiredMode = Schema.RequiredMode.REQUIRED, @@ -66,4 +72,4 @@ public class AuthLoginReqVO { return socialType == null || StrUtil.isNotEmpty(socialState); } -} \ No newline at end of file +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginRespVO.java index 1720d073b4..fdeb8ffaaa 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthLoginRespVO.java @@ -27,4 +27,7 @@ public class AuthLoginRespVO { @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime expiresTime; + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "example@example.com") + private String email; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java index 52796ec2f8..61cd77f745 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java @@ -70,4 +70,12 @@ public interface AdminAuthService { */ AuthLoginRespVO refreshToken(String refreshToken); + /** + * 邮箱登录 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO emailLogin(@Valid AuthEmailLoginReqVO reqVO); + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index 6add073721..6d1dbeae36 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -42,7 +42,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * Auth Service 实现类 * - * @author 芋道源码 + * @author � */ @Service @Slf4j @@ -66,7 +66,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { private SmsCodeApi smsCodeApi; /** - * 验证码的开关,默认为 true + * � */ @Value("${yudao.captcha.enable:true}") private Boolean captchaEnable; @@ -124,7 +124,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { // 校验验证码 smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.ADMIN_MEMBER_LOGIN.getScene(), getClientIP())); - // 获得用户信息 + // � AdminUserDO user = userService.getUserByMobile(reqVO.getMobile()); if (user == null) { throw exception(USER_NOT_EXISTS); @@ -134,6 +134,35 @@ public class AdminAuthServiceImpl implements AdminAuthService { return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE); } + @Override + public AuthLoginRespVO emailLogin(AuthEmailLoginReqVO reqVO) { + // 校验邮箱和密码 + AdminUserDO user = authenticateByEmail(reqVO.getEmail(), reqVO.getPassword()); + + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), reqVO.getEmail(), LoginLogTypeEnum.LOGIN_EMAIL); + } + + private AdminUserDO authenticateByEmail(String email, String password) { + final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_EMAIL; + // 校验邮箱是否存在 + AdminUserDO user = userService.getUserByEmail(email); + if (user == null) { + createLoginLog(null, email, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + if (!userService.isPasswordMatch(password, user.getPassword())) { + createLoginLog(user.getId(), email, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + // 校验是否禁用 + if (CommonStatusEnum.isDisable(user.getStatus())) { + createLoginLog(user.getId(), email, logTypeEnum, LoginResultEnum.USER_DISABLED); + throw exception(AUTH_LOGIN_USER_DISABLED); + } + return user; + } + private void createLoginLog(Long userId, String username, LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { // 插入登录日志