|
@@ -1,26 +1,38 @@
|
|
package com.rongwei.bscommon.system.service.impl;
|
|
package com.rongwei.bscommon.system.service.impl;
|
|
|
|
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.rongwei.bscommon.system.config.SmsCodeConfig;
|
|
import com.rongwei.bscommon.system.config.SmsCodeConfig;
|
|
|
|
+import com.rongwei.bscommon.system.fegin.QhseLoginAuth;
|
|
import com.rongwei.bscommon.system.service.AliyunSmsService;
|
|
import com.rongwei.bscommon.system.service.AliyunSmsService;
|
|
import com.rongwei.bscommon.system.service.QHSELoginService;
|
|
import com.rongwei.bscommon.system.service.QHSELoginService;
|
|
|
|
+import com.rongwei.bsentity.vo.LoginInVo;
|
|
|
|
+import com.rongwei.commonservice.service.SysConfigService;
|
|
|
|
+import com.rongwei.rwadmincommon.system.dao.SysModuleHelpDao;
|
|
|
|
+import com.rongwei.rwadmincommon.system.domain.SysLastvisitRouteDo;
|
|
|
|
+import com.rongwei.rwadmincommon.system.domain.SysModuleHelpDo;
|
|
import com.rongwei.rwadmincommon.system.domain.SysUserDo;
|
|
import com.rongwei.rwadmincommon.system.domain.SysUserDo;
|
|
import com.rongwei.rwadmincommon.system.domain.UserLoginVo;
|
|
import com.rongwei.rwadmincommon.system.domain.UserLoginVo;
|
|
|
|
+import com.rongwei.rwadmincommon.system.service.SysLastvisitRouteService;
|
|
|
|
+import com.rongwei.rwadmincommon.system.service.SysUserService;
|
|
|
|
+import com.rongwei.rwadmincommon.system.vo.JwtAuthenticationRequest;
|
|
|
|
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
|
|
import com.rongwei.rwcommon.base.BaseDo;
|
|
import com.rongwei.rwcommon.base.BaseDo;
|
|
import com.rongwei.rwcommon.base.R;
|
|
import com.rongwei.rwcommon.base.R;
|
|
|
|
+import com.rongwei.rwcommon.base.exception.CustomException;
|
|
import com.rongwei.rwcommon.utils.SecurityUtil;
|
|
import com.rongwei.rwcommon.utils.SecurityUtil;
|
|
import com.rongwei.rwcommon.utils.StringUtils;
|
|
import com.rongwei.rwcommon.utils.StringUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
-import java.util.Random;
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
/**
|
|
* QHSELoginServiceImpl class
|
|
* QHSELoginServiceImpl class
|
|
@@ -38,10 +50,21 @@ public class QHSELoginServiceImpl implements QHSELoginService {
|
|
@Autowired
|
|
@Autowired
|
|
private SmsCodeConfig smsCodeConfig;
|
|
private SmsCodeConfig smsCodeConfig;
|
|
@Autowired
|
|
@Autowired
|
|
- private RedisServiceImpl redisService;
|
|
|
|
|
|
+ private QHSEQHSERedisServiceImpl redisService;
|
|
@Autowired
|
|
@Autowired
|
|
private AliyunSmsService aliyunSmsService;
|
|
private AliyunSmsService aliyunSmsService;
|
|
-
|
|
|
|
|
|
+ @Value("${jwt.expire:1209600}")
|
|
|
|
+ private int jwtExpire;
|
|
|
|
+ @Autowired
|
|
|
|
+ private QhseLoginAuth loginAuth;
|
|
|
|
+ @Autowired
|
|
|
|
+ private SysUserService sysUserService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private SysConfigService sysConfigService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private SysLastvisitRouteService sysLastvisitRouteService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private SysModuleHelpDao sysModuleHelpDao;
|
|
/**
|
|
/**
|
|
* 双因素认证输入账号,密码,手机验证码:
|
|
* 双因素认证输入账号,密码,手机验证码:
|
|
* 1、输入用户名密码+手机号验证码双因素登录系统;
|
|
* 1、输入用户名密码+手机号验证码双因素登录系统;
|
|
@@ -105,9 +128,9 @@ public class QHSELoginServiceImpl implements QHSELoginService {
|
|
// 生成6位数验证码
|
|
// 生成6位数验证码
|
|
int smsCode = generateSms();
|
|
int smsCode = generateSms();
|
|
Map<String, Object> map = new HashMap<>();
|
|
Map<String, Object> map = new HashMap<>();
|
|
- map.put("smsCode", smsCode);
|
|
|
|
if (!smsCodeConfig.isSendEnabled()) {
|
|
if (!smsCodeConfig.isSendEnabled()) {
|
|
- redisService.redisCatchInit(smsKey, smsCode, 60);
|
|
|
|
|
|
+ map.put("smsCode", smsCode);
|
|
|
|
+ redisService.redisCatchInit(smsKey, smsCode, 100);
|
|
return R.ok(map);
|
|
return R.ok(map);
|
|
}
|
|
}
|
|
try {
|
|
try {
|
|
@@ -120,14 +143,126 @@ public class QHSELoginServiceImpl implements QHSELoginService {
|
|
throw new RuntimeException(e.getMessage());
|
|
throw new RuntimeException(e.getMessage());
|
|
}
|
|
}
|
|
// 验证码60秒过期
|
|
// 验证码60秒过期
|
|
- redisService.redisCatchInit(smsKey, smsCode, 60);
|
|
|
|
|
|
+ redisService.redisCatchInit(smsKey, smsCode, 100);
|
|
redisService.removeKey(smsErrorKey);
|
|
redisService.removeKey(smsErrorKey);
|
|
return R.ok(map);
|
|
return R.ok(map);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 登录逻辑处理
|
|
|
|
+ * @param userLogin
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public R loginIn(LoginInVo userLogin) {
|
|
|
|
+ // 验证码校验
|
|
|
|
+ String username = userLogin.getUsername();
|
|
|
|
+ List<SysUserDo> sysUserDos = qhseUserService.list(new LambdaQueryWrapper<SysUserDo>()
|
|
|
|
+ .eq(BaseDo::getDeleted, "0").eq(SysUserDo::getAccount, username));
|
|
|
|
+ if (sysUserDos.size() != 1) {
|
|
|
|
+ log.error("该账号不存在请重新输入");
|
|
|
|
+ return R.error("ZHBCZ","该账号不存在请重新输入");
|
|
|
|
+ }
|
|
|
|
+ SysUserDo sysUserDo = sysUserDos.get(0);
|
|
|
|
+ if ("1".equals(sysUserDo.getEnabled())) {
|
|
|
|
+ log.error("验证码错误");
|
|
|
|
+ return R.error("YHBKY","账号不可用,请联系管理员");
|
|
|
|
+ }
|
|
|
|
+ String mobile = sysUserDo.getMobile();
|
|
|
|
+ //密码校验
|
|
|
|
+ String secPas = SecurityUtil.getSaltMd5AndSha(userLogin.getPassword(), sysUserDo.getId());
|
|
|
|
+ if(userLogin.getPassword().equals(secPas)){
|
|
|
|
+ log.error("密码错误");
|
|
|
|
+ throw new CustomException("密码错误!请检查账号");
|
|
|
|
+ }
|
|
|
|
+ // 验证码校验
|
|
|
|
+ String smsKey = "smscode-" + mobile;
|
|
|
|
+ if(!redisService.hasKey(smsKey)){
|
|
|
|
+ log.error("验证码已过期请重新获取");
|
|
|
|
+ return R.error("YZMGQ","验证码已过期请重新获取");
|
|
|
|
+ }
|
|
|
|
+ String cacheSmsCode = redisService.getRedisCatchObj(smsKey).toString();
|
|
|
|
+ if(!cacheSmsCode.equals(userLogin.getSmsCode())){
|
|
|
|
+ log.error("验证码错误");
|
|
|
|
+ return R.error("YZMCW","验证码错误请重新输入");
|
|
|
|
+ }
|
|
|
|
+ // UserLoginVo userLoginVo= new UserLoginVo();
|
|
|
|
+ // userLoginVo.setUsername(userLogin.getUsername());
|
|
|
|
+ // userLoginVo.setPassword(userLogin.getPassword());
|
|
|
|
+ // R login = qhseAdminFegin.login(userLoginVo);
|
|
|
|
+ //token生成
|
|
|
|
+ JwtAuthenticationRequest jwtAuthenticationRequest = new JwtAuthenticationRequest(sysUserDo.getId(), sysUserDo.getAccount(), sysUserDo.getName());
|
|
|
|
+
|
|
|
|
+ jwtAuthenticationRequest.setExpire(jwtExpire);
|
|
|
|
+
|
|
|
|
+ Map<String, Object> tokenmap = loginAuth.getTokenInfo(jwtAuthenticationRequest);
|
|
|
|
+ String token = (String) tokenmap.get("token");
|
|
|
|
+ if ("ServerAbnormal".equals(token)) {
|
|
|
|
+ log.error("认证服务异常");
|
|
|
|
+ throw new RuntimeException("登录异常!请联系系统管理员");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 用户
|
|
|
|
+ SysUserVo sysUserVo = new SysUserVo();
|
|
|
|
+ BeanUtils.copyProperties(sysUserDo, sysUserVo);
|
|
|
|
+ qhseUserService.getUserRoleOrgPer(sysUserVo);
|
|
|
|
+
|
|
|
|
+ // 设置密码是否过期
|
|
|
|
+ String pwConfig = sysConfigService.getContentByConfigCode("pwConfig");
|
|
|
|
+ if (StringUtils.isNotBlank(pwConfig)) {
|
|
|
|
+ cn.hutool.json.JSONObject pwConfigJo = JSONUtil.parseObj(pwConfig);
|
|
|
|
+ if (pwConfigJo.getInt("overdueDays") != null) {
|
|
|
|
+ int overdueDays = pwConfigJo.getInt("overdueDays");
|
|
|
|
+ String userRoption = sysUserVo.getRoption();
|
|
|
|
+ if (StringUtils.isNotBlank(userRoption)) {
|
|
|
|
+ cn.hutool.json.JSONObject userRoptionJo = JSONUtil.parseObj(userRoption);
|
|
|
|
+ if (userRoptionJo.containsKey("lastUpdatePwTime")) {
|
|
|
|
+ String lastUpdatePwTime = userRoptionJo.getStr("lastUpdatePwTime");
|
|
|
|
+ Date oDay = DateUtil.offsetDay(DateUtil.parse(lastUpdatePwTime, "yyyy-MM-dd HH:mm:ss"), overdueDays);
|
|
|
|
+ // 超过强制修改密码的天数了
|
|
|
|
+ if (oDay != null && DateUtil.compare(new Date(), oDay) >= 0) {
|
|
|
|
+ sysUserVo.setHasPwOverdue("overdue");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (pwConfigJo.getBool("updateFirst", false)) {
|
|
|
|
+ Boolean updateFirst = pwConfigJo.getBool("updateFirst");
|
|
|
|
+ if (updateFirst) {
|
|
|
|
+ String userRoption = sysUserVo.getRoption();
|
|
|
|
+ if (StringUtils.isNotBlank(userRoption)) {
|
|
|
|
+ cn.hutool.json.JSONObject userRoptionJo = JSONUtil.parseObj(userRoption);
|
|
|
|
+ // 当updateFirst=true以及没有lastUpdatePwTime时,判定为未修改初始密码
|
|
|
|
+ if (!userRoptionJo.containsKey("lastUpdatePwTime")) {
|
|
|
|
+ sysUserVo.setHasPwOverdue("overdue");
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ sysUserVo.setHasPwOverdue("overdue");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ setModuleHelp(sysUserVo);
|
|
|
|
+ // 设置最后一次登录的路由
|
|
|
|
+ List<SysLastvisitRouteDo> lastvisitRouteDos = sysLastvisitRouteService.list(new LambdaQueryWrapper<SysLastvisitRouteDo>()
|
|
|
|
+ .eq(SysLastvisitRouteDo::getUserid, sysUserVo.getId()).orderByAsc(SysLastvisitRouteDo::getRoutesort));
|
|
|
|
+ sysUserVo.setSysLastvisitRouteDos(lastvisitRouteDos);
|
|
|
|
+ // 菜单
|
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
|
+ map.put("token", token);
|
|
|
|
+ map.put("userInfo", sysUserVo);
|
|
|
|
+ //redis缓存登录用户信息
|
|
|
|
+ redisService.setLoginUser(token, sysUserVo);
|
|
|
|
+ redisService.removeKey(smsKey);
|
|
|
|
+ return R.ok(map);
|
|
|
|
+ }
|
|
|
|
+
|
|
public int generateSms() {
|
|
public int generateSms() {
|
|
return 100000 + new Random().nextInt(900000);
|
|
return 100000 + new Random().nextInt(900000);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
|
|
+ private void setModuleHelp(SysUserVo sysUserVo){
|
|
|
|
+ List<SysModuleHelpDo> sysModuleHelpDos = sysModuleHelpDao.selectList(new LambdaQueryWrapper<SysModuleHelpDo>());
|
|
|
|
+ sysUserVo.setSysmodulehelp(sysModuleHelpDos);
|
|
|
|
+ }
|
|
}
|
|
}
|