diff --git a/config/dev/ruoyi-gateway.yml b/config/dev/ruoyi-gateway.yml index ed0e66e4..5f0f5b6d 100644 --- a/config/dev/ruoyi-gateway.yml +++ b/config/dev/ruoyi-gateway.yml @@ -26,6 +26,7 @@ security: - /auth/smsLogin - /auth/xcxLogin - /auth/register + - /resource/sms/code - /*/v2/api-docs - /csrf diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java index 139462d8..fedadfd8 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java @@ -48,12 +48,12 @@ public class TokenController { } /** - * 短信登录(示例) + * 短信登录 * * @param smsLoginBody 登录信息 * @return 结果 */ - @ApiOperation("短信登录(示例)") + @ApiOperation("短信登录") @PostMapping("/smsLogin") public R> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) { Map ajax = new HashMap<>(); diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java index fafff79e..51d27137 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java @@ -9,6 +9,7 @@ import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.enums.DeviceType; import com.ruoyi.common.core.enums.LoginType; import com.ruoyi.common.core.enums.UserType; +import com.ruoyi.common.core.exception.user.CaptchaExpireException; import com.ruoyi.common.core.exception.user.UserException; import com.ruoyi.common.core.utils.MessageUtils; import com.ruoyi.common.core.utils.ServletUtils; @@ -130,8 +131,12 @@ public class SysLoginService { * 校验短信验证码 */ private boolean validateSmsCode(String phonenumber, String smsCode) { - // todo 此处使用手机号查询redis验证码与参数验证码是否一致 用户自行实现 - return true; + String code = RedisUtils.getCacheObject(Constants.CAPTCHA_CODE_KEY + phonenumber); + if (StringUtils.isNotBlank(code)) { + recordLogininfor(phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(smsCode); } /** diff --git a/ruoyi-modules/ruoyi-resource/pom.xml b/ruoyi-modules/ruoyi-resource/pom.xml index 908cd638..1e67ed03 100644 --- a/ruoyi-modules/ruoyi-resource/pom.xml +++ b/ruoyi-modules/ruoyi-resource/pom.xml @@ -78,6 +78,22 @@ ruoyi-common-oss + + com.ruoyi + ruoyi-common-sms + + + + + com.aliyun + dysmsapi20170525 + + + + + + + com.ruoyi ruoyi-common-mybatis diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/com/ruoyi/resource/controller/SysSmsController.java b/ruoyi-modules/ruoyi-resource/src/main/java/com/ruoyi/resource/controller/SysSmsController.java new file mode 100644 index 00000000..fb097d38 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/com/ruoyi/resource/controller/SysSmsController.java @@ -0,0 +1,69 @@ +package com.ruoyi.resource.controller; + + +import cn.hutool.core.util.RandomUtil; +import com.ruoyi.common.core.constant.Constants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.redis.utils.RedisUtils; +import com.ruoyi.common.sms.config.properties.SmsProperties; +import com.ruoyi.common.sms.core.SmsTemplate; +import com.ruoyi.common.sms.entity.SmsResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotBlank; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +/** + * 短信功能 + * + * @author Lion Li + */ +@Slf4j +@Validated +@Api(value = "短信功能控制器", tags = {"短信功能管理"}) +@RequiredArgsConstructor +@RestController +@RequestMapping("/sms") +public class SysSmsController extends BaseController { + + private final SmsProperties smsProperties; + private final SmsTemplate smsTemplate; + + /** + * 短信验证码 + */ + @ApiOperation("短信验证码") + @GetMapping("/code") + public R smsCaptcha(@ApiParam("用户手机号") + @NotBlank(message = "{user.phonenumber.not.blank}") + String phonenumber) { + if (smsProperties.getEnabled()) { + R.fail("当前系统没有开启短信功能!"); + } + String key = Constants.CAPTCHA_CODE_KEY + phonenumber; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + // 验证码模板id 自行处理 (查数据库或写死均可) + String templateId = ""; + Map map = new HashMap<>(1); + map.put("code", code); + SmsResult result = smsTemplate.send(phonenumber, templateId, map); + if (!result.isSuccess()) { + log.error("验证码短信发送异常 => {}", result); + return R.fail(result.getMessage()); + } + return R.ok(); + } + +}