feat(auth): dev-only fixed sms code to unblock demo login
aihr.sms.dev-fixed-code 非空时不真发短信、验证码固定(dev 默认 123456),把阿里云短信凭证从演示关键路径摘掉;代码级 prod profile 闸门,生产配置该项也不生效。
This commit is contained in:
+19
-3
@@ -29,6 +29,8 @@ import org.dromara.sms4j.api.entity.SmsResponse;
|
|||||||
import org.dromara.sms4j.core.factory.SmsFactory;
|
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||||
import org.dromara.web.domain.vo.CaptchaVo;
|
import org.dromara.web.domain.vo.CaptchaVo;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
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.Expression;
|
||||||
import org.springframework.expression.ExpressionParser;
|
import org.springframework.expression.ExpressionParser;
|
||||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||||
@@ -58,6 +60,15 @@ public class CaptchaController {
|
|||||||
@Value("${aihr.sms.login-template-id:}")
|
@Value("${aihr.sms.login-template-id:}")
|
||||||
private String smsLoginTemplateId;
|
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<Void> smsCode(
|
public R<Void> smsCode(
|
||||||
@NotBlank(message = "{user.phonenumber.not.blank}")
|
@NotBlank(message = "{user.phonenumber.not.blank}")
|
||||||
@Pattern(regexp = RegexConstants.MOBILE, message = "{user.mobile.phone.number.not.valid}") String phonenumber) {
|
@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;
|
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);
|
String code = RandomUtil.randomNumbers(4);
|
||||||
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
||||||
map.put("code", code);
|
map.put("code", code);
|
||||||
|
|||||||
@@ -158,6 +158,8 @@ mail:
|
|||||||
aihr:
|
aihr:
|
||||||
sms:
|
sms:
|
||||||
login-template-id: ${AIHR_SMS_LOGIN_TEMPLATE_ID:}
|
login-template-id: ${AIHR_SMS_LOGIN_TEMPLATE_ID:}
|
||||||
|
# 演示兜底:非空则不真发短信,验证码固定为该值(仅 dev,prod 配置不含此项)
|
||||||
|
dev-fixed-code: ${AIHR_SMS_DEV_FIXED_CODE:123456}
|
||||||
sms:
|
sms:
|
||||||
# 配置源类型用于标定配置来源(interface,yaml)
|
# 配置源类型用于标定配置来源(interface,yaml)
|
||||||
config-type: yaml
|
config-type: yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user