From e1a14564d085123000e48e58412d9404fe15b254 Mon Sep 17 00:00:00 2001 From: chenbowen Date: Tue, 16 Sep 2025 09:10:48 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E7=9A=84=E7=99=BB=E5=BD=95=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 ++----- .../system/enums/ErrorCodeConstants.java | 1 + .../controller/admin/auth/AuthController.java | 8 ++++ .../admin/auth/vo/AuthTestLoginReqVO.java | 30 +++++++++++++++ .../system/service/auth/AdminAuthService.java | 9 +++++ .../service/auth/AdminAuthServiceImpl.java | 38 +++++++++++++++++++ 6 files changed, 90 insertions(+), 9 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthTestLoginReqVO.java diff --git a/pom.xml b/pom.xml index 9aa8e9fe..d9f8f1bc 100644 --- a/pom.xml +++ b/pom.xml @@ -16,20 +16,15 @@ yudao-module-system yudao-module-infra - yudao-module-bpm - yudao-module-report - yudao-module-mp - - - + yudao-module-template - yudao-module-databus - yudao-module-rule - yudao-module-html2pdf + + + ${project.artifactId} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 23ec0035..abe18bdc 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -17,6 +17,7 @@ public interface ErrorCodeConstants { ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_002_000_005, "未绑定账号,需要进行绑定"); ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_007, "手机号不存在"); ErrorCode AUTH_REGISTER_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_008, "验证码不正确,原因:{}"); + ErrorCode AUTH_TEST_LOGIN_NOT_ALLOWED = new ErrorCode(1_002_000_009, "测试登录接口仅在测试环境和本地开发环境下可用"); // ========== 菜单模块 1-002-001-000 ========== ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1_002_001_000, "已经存在该名字的菜单"); diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java index c4e4f103..51c5f14b 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java @@ -71,6 +71,14 @@ public class AuthController { return success(authService.login(reqVO)); } + @PostMapping("/test-login") + @PermitAll + @Operation(summary = "测试登录(无验证码校验)", description = "仅用于测试环境和本地开发,生产环境不可用") + @TenantIgnore + public CommonResult testLogin(@RequestBody @Valid AuthTestLoginReqVO reqVO) { + return success(authService.testLogin(reqVO)); + } + @PostMapping("/logout") @PermitAll @Operation(summary = "登出系统") diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthTestLoginReqVO.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthTestLoginReqVO.java new file mode 100644 index 00000000..4262b2e3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthTestLoginReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.system.controller.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Pattern; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +@Schema(description = "管理后台 - 测试登录 Request VO(无验证码校验,仅测试环境和本地开发可用)") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthTestLoginReqVO { + + @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudaoyuanma") + @NotEmpty(message = "登录账号不能为空") + @Length(min = 4, max = 16, message = "账号长度为 4-16 位") + @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java index b20b1170..e817043f 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java @@ -30,6 +30,15 @@ public interface AdminAuthService { */ AuthLoginRespVO login(@Valid AuthLoginReqVO reqVO); + /** + * 测试登录(无验证码校验) + * 仅用于测试环境和本地开发,生产环境不可用 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO testLogin(@Valid AuthTestLoginReqVO reqVO); + /** * 基于 token 退出登录 * diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index 0a3b5164..d7da8b22 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -78,6 +78,13 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Setter // 为了单测:开启或者关闭验证码 private Boolean captchaEnable; + /** + * 测试登录的开关,默认为 false + * 仅在测试环境(test)和本地开发环境(local/dev)下允许 + */ + @Value("${spring.profiles.active:}") + private String activeProfile; + @Override public AdminUserDO authenticate(String username, String password) { final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; @@ -116,6 +123,18 @@ public class AdminAuthServiceImpl implements AdminAuthService { return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); } + @Override + public AuthLoginRespVO testLogin(AuthTestLoginReqVO reqVO) { + // 检查是否为测试环境或本地开发环境 + validateTestEnvironment(); + + // 使用账号密码,进行登录(跳过验证码校验) + AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword()); + + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); + } + @Override public void sendSmsCode(AuthSmsSendReqVO reqVO) { // 如果是重置密码场景,需要校验图形验证码是否正确 @@ -307,4 +326,23 @@ public class AdminAuthServiceImpl implements AdminAuthService { userService.updateUserPassword(userByMobile.getId(), reqVO.getPassword()); } + + /** + * 验证是否为测试环境或本地开发环境 + * 仅在 test、local、dev 环境下允许使用测试登录接口 + */ + private void validateTestEnvironment() { + if (StringUtils.isBlank(activeProfile)) { + throw exception(AUTH_TEST_LOGIN_NOT_ALLOWED); + } + + String profile = activeProfile.toLowerCase(); + boolean isTestEnvironment = profile.contains("test") || + profile.contains("local") || + profile.contains("dev"); + + if (!isTestEnvironment) { + throw exception(AUTH_TEST_LOGIN_NOT_ALLOWED); + } + } }