|
@@ -1,8 +1,12 @@
|
|
|
package cn.cslg.permission.service;
|
|
|
|
|
|
import cn.cslg.permission.common.core.base.RedisConf;
|
|
|
+import cn.cslg.permission.common.core.business.LoginCacheKeyUtil;
|
|
|
+import cn.cslg.permission.common.core.business.SmsService;
|
|
|
import cn.cslg.permission.common.model.dto.EncryptionFunctionDTO;
|
|
|
import cn.cslg.permission.common.model.dto.EncryptionLoginDTO;
|
|
|
+import cn.cslg.permission.common.model.dto.PhoneLoginDTO;
|
|
|
+import cn.cslg.permission.common.model.dto.SendCodeDTO;
|
|
|
import cn.cslg.permission.common.model.vo.*;
|
|
|
import cn.cslg.permission.common.utils.*;
|
|
|
import cn.cslg.permission.common.utils.message.MessageUtils;
|
|
@@ -24,6 +28,7 @@ import cn.hutool.captcha.CaptchaUtil;
|
|
|
import cn.hutool.captcha.CircleCaptcha;
|
|
|
import cn.hutool.core.img.ImgUtil;
|
|
|
import cn.hutool.core.lang.UUID;
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
import cn.hutool.crypto.SecureUtil;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
@@ -42,7 +47,6 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import javax.servlet.ServletRequest;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
@@ -68,6 +72,7 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
|
|
|
private final RoleFunctionDataService roleFunctionDataService;
|
|
|
private final FunctionService functionService;
|
|
|
private final ApplicationService applicationService;
|
|
|
+ private final SmsService smsService;
|
|
|
@Autowired
|
|
|
private PersonnelMapper personnelMapper;
|
|
|
@Autowired
|
|
@@ -402,6 +407,7 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
|
|
|
loginVO.setPersonnelUserName(personnel.getPersonnelUserName());
|
|
|
loginVO.setPersonnelPhone(personnel.getPersonnelPhone());
|
|
|
loginVO.setMachineCode(vo.getMachineCode());
|
|
|
+ loginVO.setPersonnelConfig(personnel.getPersonConfig());
|
|
|
//Sa-token 登录方法 登录后 生成Token 如果集成了Redis的话 会自动存入Redis
|
|
|
StpUtil.login(personnel.getId());
|
|
|
loginVO.setToken(StpUtil.getTokenValue());
|
|
@@ -536,4 +542,109 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
|
|
|
}
|
|
|
return functionVOS;
|
|
|
}
|
|
|
+
|
|
|
+ //---------------------------------------二期开发--------------------------
|
|
|
+ /**
|
|
|
+ * 发送验证码
|
|
|
+ *
|
|
|
+ * @param vo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getPhoneCode(SendCodeDTO vo) {
|
|
|
+ String res = "发送验证码失败";
|
|
|
+ if (Boolean.TRUE.equals(StringUtils.isEmpty(vo.getPhoneNum()))) {
|
|
|
+ return Response.error(ResponseEnum.THE_PHONE_IS_NOT_EMPTY);
|
|
|
+ }
|
|
|
+ if (!RegexUtil.isPhoneLegal(vo.getPhoneNum())) {
|
|
|
+ return Response.error(ResponseEnum.THE_PHONE_FORMAT_ERROR);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(vo.getPhoneNum())) {
|
|
|
+ //生成验证码
|
|
|
+ String random = RandomUtil.getSixRandom();
|
|
|
+ //手机号和验证码放进缓存 设置过期时间60s
|
|
|
+ redisUtil.set(LoginCacheKeyUtil.getLoginCaptcha(vo.getPhoneNum()), random);
|
|
|
+ redisUtil.expire(LoginCacheKeyUtil.getLoginCaptcha(vo.getPhoneNum()), 60L,TimeUnit.SECONDS);
|
|
|
+ //发送短信
|
|
|
+ smsService.sendMessage(vo.getPhoneNum(), random);
|
|
|
+ res = "发送验证码成功";
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 手机号登录
|
|
|
+ *
|
|
|
+ * @param dto
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
|
|
|
+ public String loginByPhone(PhoneLoginDTO dto) throws Exception {
|
|
|
+ String machineCode = dto.getMachineCode();
|
|
|
+ final String sign = dto.getSign();
|
|
|
+ final String appKey = dto.getAppKey();
|
|
|
+ long currentTimeMillis = dto.getCurrentTimeMillis() / 1000;
|
|
|
+ long currentTimeSecond = System.currentTimeMillis() / 1000;
|
|
|
+ final long second = currentTimeSecond - currentTimeMillis;
|
|
|
+ if (second > 30) {
|
|
|
+ return Response.error(ResponseEnum.THE_REQUEST_TIME_OVERTIME);
|
|
|
+ }
|
|
|
+ String appSecret = appKey + currentTimeMillis;
|
|
|
+ String md5Sign = SecureUtil.md5(appSecret);
|
|
|
+ if (Boolean.TRUE.equals(StringUtils.isEmpty(sign)) || !sign.equals(md5Sign)) {
|
|
|
+ return Response.error(ResponseEnum.THE_SIGN_IS_NOT_SAME);
|
|
|
+ }
|
|
|
+ if (Boolean.TRUE.equals(StringUtils.isEmpty(machineCode))) {
|
|
|
+ return Response.error(ResponseEnum.THE_MACHINE_CODE_IS_NULL);
|
|
|
+ }
|
|
|
+ //获取缓存中验证码
|
|
|
+ String code = redisUtil.get(LoginCacheKeyUtil.getLoginCaptcha(dto.getPhoneNum()));
|
|
|
+ if (Boolean.TRUE.equals(StringUtils.isEmpty(code))) {
|
|
|
+ return Response.error(ResponseEnum.THE_PHONE_CODE_IS_INVALID);
|
|
|
+ }
|
|
|
+
|
|
|
+ //校验验证码
|
|
|
+ if (Boolean.TRUE.equals(StringUtils.isEmpty(dto.getPhoneCode()))) {
|
|
|
+ return Response.error(ResponseEnum.THE_PHONE_CODE_IS_NOT_NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!org.apache.commons.lang3.StringUtils.equals(code, dto.getPhoneCode())) {
|
|
|
+ return Response.error(ResponseEnum.THE_PHONE_CODE_IS_INCONFORMITY);
|
|
|
+ }
|
|
|
+ //校验验证码成功后使其失效
|
|
|
+ redisUtil.delete(LoginCacheKeyUtil.getLoginCaptcha(dto.getPhoneNum()));
|
|
|
+ //查询用户
|
|
|
+ LambdaQueryWrapper<Personnel> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ if (org.apache.commons.lang3.StringUtils.isNotEmpty(dto.getPhoneNum())) {
|
|
|
+ queryWrapper.eq(Personnel::getPersonnelPhone, dto.getPhoneNum());
|
|
|
+ }
|
|
|
+ Personnel person = personnelMapper.selectOne(queryWrapper);
|
|
|
+ if (org.apache.commons.lang3.ObjectUtils.isEmpty(person)) {
|
|
|
+ return Response.error(ResponseEnum.THE_PERSONNEL_IS_NOT_EXIST);
|
|
|
+ }
|
|
|
+ if (person.getPersonnelStatus().equals(0)) {
|
|
|
+ return Response.error(ResponseEnum.THE_PERSONNEL_IS_FORBIDDEN);
|
|
|
+ }
|
|
|
+ //人员信息中私钥或公钥为空则添加进去
|
|
|
+ this.updatePersonnel(person.getPrivateKey(), person.getPublicKey(), person.getSymmetryKey(), person.getId());
|
|
|
+ person = personnelMapper.selectById(person.getId());
|
|
|
+ List<AssoPersonnelMachine> machineList = assoPersonnelMachineMapper.selectList(new LambdaQueryWrapper<AssoPersonnelMachine>()
|
|
|
+ .eq(AssoPersonnelMachine::getPersonnelId, person.getId())
|
|
|
+ .ne(AssoPersonnelMachine::getMachineCode, SecureUtil.md5(machineCode)));
|
|
|
+ if (machineList.size() > 1) {
|
|
|
+ return Response.error(ResponseEnum.DO_NOT_LOG_IN_TO_MORE_THAN_TWO_NEW_MACHINES_WITH_THE_SAME_ACCOUNT);
|
|
|
+ }
|
|
|
+ addOrUpdatePersonnelMachine(machineCode, person);
|
|
|
+ PhoneLoginVO loginVO = new PhoneLoginVO();
|
|
|
+ loginVO.setPersonId(person.getId());
|
|
|
+ loginVO.setPersonnelUserName(person.getPersonnelUserName());
|
|
|
+ loginVO.setPersonnelName(person.getPersonnelName());
|
|
|
+ loginVO.setPersonnelPhone(person.getPersonnelPhone());
|
|
|
+ loginVO.setPrivateKey(person.getPrivateKey());
|
|
|
+ loginVO.setPersonnelConfig(person.getPersonConfig());
|
|
|
+ loginVO.setMachineCode(loginVO.getMachineCode());
|
|
|
+ //Sa-token 登录方法 登录后 生成Token 如果集成了Redis的话 会自动存入Redis
|
|
|
+ StpUtil.login(person.getId());
|
|
|
+ loginVO.setToken(StpUtil.getTokenValue());
|
|
|
+ return Response.success(loginVO);
|
|
|
+ }
|
|
|
}
|