Commit e3eec96a authored by tanyang's avatar tanyang

新增短信配置

parent fdc10cb4
...@@ -10,6 +10,7 @@ import com.dsk.common.constant.Constants; ...@@ -10,6 +10,7 @@ import com.dsk.common.constant.Constants;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.enums.CaptchaType; import com.dsk.common.enums.CaptchaType;
import com.dsk.common.exception.user.CaptchaException;
import com.dsk.common.exception.user.CaptchaExpireException; import com.dsk.common.exception.user.CaptchaExpireException;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.MessageUtils; import com.dsk.common.utils.MessageUtils;
...@@ -29,6 +30,7 @@ import org.dromara.sms4j.api.SmsBlend; ...@@ -29,6 +30,7 @@ import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory; import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType; import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.springframework.beans.factory.annotation.Value;
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;
...@@ -60,18 +62,23 @@ public class CaptchaController { ...@@ -60,18 +62,23 @@ public class CaptchaController {
private final MailProperties mailProperties; private final MailProperties mailProperties;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@Value("${captcha.enable}")
private boolean captchaEnabled;
/** /**
* 发送短信验证码 * 发送短信验证码
* *
* @param phonenumber 用户手机号 * @param phonenumber 用户手机号
*/ */
@GetMapping("/captchaSms") @GetMapping("/captchaSms")
public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber,String uid,String captchaCode,String templateId) {
String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
// 验证码开关
if (captchaEnabled) {
validateCaptcha(phonenumber, captchaCode, uid);
}
String code = RandomUtil.randomNumbers(6); String code = RandomUtil.randomNumbers(6);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 验证码模板id 自行处理 (查数据库或写死均可) // 验证码模板id 自行处理 (查数据库或写死均可)
String templateId = "";
LinkedHashMap<String, String> map = new LinkedHashMap<>(1); LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("code", code); map.put("code", code);
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
...@@ -83,6 +90,20 @@ public class CaptchaController { ...@@ -83,6 +90,20 @@ public class CaptchaController {
return R.ok(); return R.ok();
} }
private void validateCaptcha(String phonenumber, String captchaCode, String uuid) {
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey);
if (captcha == null) {
// recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
if (!captchaCode.equalsIgnoreCase(captcha)) {
// recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
throw new CaptchaException();
}
}
/** /**
* 开发需要,临时发送短信验证码 * 开发需要,临时发送短信验证码
*/ */
......
...@@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore; ...@@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.RandomUtil;
import com.dsk.common.constant.Constants; import com.dsk.common.constant.Constants;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
...@@ -24,6 +25,10 @@ import com.dsk.system.service.ISysMenuService; ...@@ -24,6 +25,10 @@ import com.dsk.system.service.ISysMenuService;
import com.dsk.system.service.ISysUserService; import com.dsk.system.service.ISysUserService;
import com.dsk.system.service.SysLoginService; import com.dsk.system.service.SysLoginService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -32,6 +37,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -32,6 +37,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.time.Duration; import java.time.Duration;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -116,6 +122,36 @@ public class SysLoginController { ...@@ -116,6 +122,36 @@ public class SysLoginController {
} }
/**
* 获取当前用户默认租户
* @return
*/
@SaIgnore
@PostMapping("/user/default/tenant/phone")
public R<Map> userDefaultTenant(String phone) {
// LoginUser loginUser = LoginHelper.getLoginUser();
// Assert.notNull(loginUser,"用户信息不存在!");
String defaultTenantKey = GlobalConstants.PHONE_DEFAULT_TENANT + phone;
String defaultTenant = RedisUtils.getCacheObject(defaultTenantKey);
return R.ok(MapUtil.of("tenantId",defaultTenant));
}
/**
* 发送短信验证码
*
* @param phones 电话号
* @param templateId 模板ID
*/
@SaIgnore
@GetMapping("/send/sms/code")
public R<Object> sendAliyun(String phones, String templateId) {
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("code", RandomUtil.randomNumbers(4));
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
return R.ok(smsResponse);
}
/** /**
* 短信登录 * 短信登录
* *
...@@ -124,14 +160,11 @@ public class SysLoginController { ...@@ -124,14 +160,11 @@ public class SysLoginController {
*/ */
@SaIgnore @SaIgnore
@PostMapping("/smsLogin") @PostMapping("/smsLogin")
public R<Map<String, Object>> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) { public R<LoginVo> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
Map<String, Object> ajax = new HashMap<>();
// 生成令牌 // 生成令牌
String token = loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode()); LoginVo loginVo=loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
ajax.put(Constants.TOKEN, token); return R.ok(loginVo);
return R.ok(ajax);
} }
/** /**
* 邮件登录 * 邮件登录
* *
......
...@@ -167,11 +167,11 @@ sms: ...@@ -167,11 +167,11 @@ sms:
#请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置 #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
requestUrl: dysmsapi.aliyuncs.com requestUrl: dysmsapi.aliyuncs.com
#阿里云的accessKey #阿里云的accessKey
accessKeyId: xxxxxxx accessKeyId: LTAIC4Pb2jJZbUmD
#阿里云的accessKeySecret #阿里云的accessKeySecret
accessKeySecret: xxxxxxx accessKeySecret: L7VANFwqaTludkczLsg9jhvidk0e28
#短信签名 #短信签名
signature: 测试 signature: 大司空信息科技
tencent: tencent:
#请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置 #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
requestUrl: sms.tencentcloudapi.com requestUrl: sms.tencentcloudapi.com
......
...@@ -187,19 +187,64 @@ public class SysLoginService { ...@@ -187,19 +187,64 @@ public class SysLoginService {
return StpUtil.getTokenValue(); return StpUtil.getTokenValue();
} }
public String smsLogin(String phonenumber, String smsCode) { public LoginVo smsLogin(String username, String smsCode) {
// 通过手机号查找用户 String tenantId=null;
SysUser user = loadUserByPhonenumber(phonenumber); if(ReUtil.isMatch(RegexPool.MOBILE, username)) {
String defaultTenantId = RedisUtils.getCacheObject(GlobalConstants.PHONE_DEFAULT_TENANT + username);
log.info("登录用户:{} 获取缓存默认租户:"+tenantId, username);
if(StrUtil.isNotBlank(defaultTenantId)){
tenantId=defaultTenantId;
}
}
checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(phonenumber, smsCode)); //查询手机号绑定的所有用户
if (StrUtil.isEmpty(tenantId)) {
List<SysUser> sysUsers = queryListByPhone(username);
if (CollectionUtil.isEmpty(sysUsers)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
} else if (sysUsers.size() > 1) {
//处理存在多个用户的情况,取一个最新租户
SysUser sysUser = sysUsers.get(0);
if (ObjectUtil.isEmpty(sysUser)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
}
tenantId = sysUser.getTenantId();
}else {
SysUser sysUser = sysUsers.get(0);
tenantId = sysUser.getTenantId();
}
}
// 校验租户
if (tenantId != null) {
checkTenant(tenantId);
}
if (tenantId == null || "".equals(tenantId)) {
tenantId = TenantConstants.DEFAULT_TENANT_ID;
}
TenantHelper.setTenantId(tenantId);
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
// SysUser user = loadUserByUsername(username);
// return TenantBroker.applyAs(tenantId, (id -> {
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
SysUser user = loadUserByUsername(username);
checkLogin(LoginType.PASSWORD, username, () -> !validateSmsCode(username, smsCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
LoginUser loginUser = buildLoginUser(user); LoginUser loginUser = buildLoginUser(user);
// 生成token // 生成token
LoginHelper.loginByDevice(loginUser, DeviceType.APP); LoginHelper.loginByDevice(loginUser, DeviceType.PC);
recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
recordLoginInfo(user.getUserId(), user.getUserName()); recordLoginInfo(user.getUserId(), username);
return StpUtil.getTokenValue();
LoginVo loginVo = new LoginVo();
loginVo.setTenantId(TenantHelper.getTenantId());
loginVo.setAccessToken(StpUtil.getTokenValue());
loginVo.setExpireIn(StpUtil.getTokenTimeout());
return loginVo;
} }
public String emailLogin(String email, String emailCode) { public String emailLogin(String email, String emailCode) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment