diff --git a/backend/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/backend/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java index 021ecd18..80244362 100644 --- a/backend/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java +++ b/backend/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java @@ -29,6 +29,8 @@ import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.core.factory.SmsFactory; import org.dromara.web.domain.vo.CaptchaVo; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; @@ -58,6 +60,15 @@ public class CaptchaController { @Value("${aihr.sms.login-template-id:}") private String smsLoginTemplateId; + /** + * 演示/开发兜底:配置后不真发短信,验证码固定为该值,把短信通道从演示关键路径摘掉。 + * prod profile 下无条件忽略(代码级闸门,防止配置失误造成登录绕过)。 + */ + @Value("${aihr.sms.dev-fixed-code:}") + private String smsDevFixedCode; + + private final Environment environment; + /** * 短信验证码 * @@ -68,10 +79,15 @@ public class CaptchaController { public R smsCode( @NotBlank(message = "{user.phonenumber.not.blank}") @Pattern(regexp = RegexConstants.MOBILE, message = "{user.mobile.phone.number.not.valid}") String phonenumber) { - if (StringUtils.isBlank(smsLoginTemplateId)) { - return R.fail("短信模板未配置:请设置 aihr.sms.login-template-id"); - } String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; + if (StringUtils.isNotBlank(smsDevFixedCode) && !environment.acceptsProfiles(Profiles.of("prod"))) { + log.warn("aihr.sms.dev-fixed-code 已启用,短信验证码走固定码,未真实发送短信"); + RedisUtils.setCacheObject(key, smsDevFixedCode, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + return R.ok(); + } + if (StringUtils.isBlank(smsLoginTemplateId)) { + return R.fail("短信模板未配置:请设置 aihr.sms.login-template-id 或开发环境设置 aihr.sms.dev-fixed-code"); + } String code = RandomUtil.randomNumbers(4); LinkedHashMap map = new LinkedHashMap<>(1); map.put("code", code); diff --git a/backend/ruoyi-admin/src/main/resources/application-dev.yml b/backend/ruoyi-admin/src/main/resources/application-dev.yml index 567848b5..c4d4ee7e 100644 --- a/backend/ruoyi-admin/src/main/resources/application-dev.yml +++ b/backend/ruoyi-admin/src/main/resources/application-dev.yml @@ -158,6 +158,8 @@ mail: aihr: sms: login-template-id: ${AIHR_SMS_LOGIN_TEMPLATE_ID:} + # 演示兜底:非空则不真发短信,验证码固定为该值(仅 dev,prod 配置不含此项) + dev-fixed-code: ${AIHR_SMS_DEV_FIXED_CODE:123456} sms: # 配置源类型用于标定配置来源(interface,yaml) config-type: yaml