add 企业联系人登录

This commit is contained in:
lijiarao
2021-09-22 21:12:40 +08:00
parent 82a0c21ada
commit d0f4716cc3
10 changed files with 328 additions and 7 deletions
@@ -0,0 +1,162 @@
package com.jero.company.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jero.common.api.vo.Result;
import com.jero.common.constant.CommonConstant;
import com.jero.common.exception.JeroBootException;
import com.jero.common.system.api.ISysBaseAPI;
import com.jero.common.system.util.JwtUtil;
import com.jero.common.system.vo.LoginUser;
import com.jero.common.util.*;
import com.jero.company.entity.PayContactsManagement;
import com.jero.company.service.IPayContactsManagementService;
import com.jero.modules.base.service.BaseCommonService;
import com.jero.modules.system.model.SysLoginModel;
import com.jero.modules.system.service.ISysDictService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Objects;
/**
* @author liJiaRao
* @date 2021-09-22 19:28
*/
@RestController
@RequestMapping("/company")
@Api(tags = "企业端登录")
@Slf4j
public class CompanyLoginController {
@Autowired
private RedisUtil redisUtil;
@Autowired
private ISysBaseAPI sysBaseAPI;
@Autowired
private IPayContactsManagementService payContactsManagementService;
@Autowired
private ISysDictService sysDictService;
@Resource
private BaseCommonService baseCommonService;
/**
* 密码登录错误的次数前缀
*/
public static final String RETRY_LOGIN_PREFIX = "login:retryLoginCount_";
/**
* 密码登录错误的最大限制次数
*/
public static final int RETRY_LOGIN_MAX_COUNT = 5;
@ApiOperation("登录接口")
@PostMapping(value = "/login")
public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel) {
Result<JSONObject> result = new Result<>();
String username = PasswordUtil.encrypt(sysLoginModel.getUsername());
String password = sysLoginModel.getPassword();
/*String rsaPublicKey = sysLoginModel.getRsaPublicKey();
String rsaPrivateKey = String.valueOf(redisUtil.get(rsaPublicKey));
//update-begin--Author:scott Date:20190805 for:暂时注释掉密码加密逻辑,有点问题
//前端密码加密,后端进行密码解密
//password = AesEncryptUtil.desEncrypt(sysLoginModel.getPassword().replaceAll("%2B", "\\+")).trim();//密码解密
//update-begin--Author:scott Date:20190805 for:暂时注释掉密码加密逻辑,有点问题
//update-begin-author:taoyan date:20190828 for:校验验证码
String captcha = sysLoginModel.getCaptcha();
if (captcha == null) {
result.error500("验证码无效");
return result;
}
String lowerCaseCaptcha = captcha.toLowerCase();
String realKey = MD5Util.MD5Encode(lowerCaseCaptcha + sysLoginModel.getCheckKey(), "utf-8");
Object checkCode = redisUtil.get(realKey);
//当进入登录页时,有一定几率出现验证码错误 #1714
if (checkCode == null || !checkCode.toString().equals(lowerCaseCaptcha)) {
result.error500("验证码错误");
return result;
} else {
redisUtil.del(realKey);
}
try {
//解密获取密码和用户名
password = CommonUtils.decryptBtRsaPriKey(password, rsaPrivateKey);
username = CommonUtils.decryptBtRsaPriKey(username, rsaPrivateKey);
} catch (Exception e) {
e.printStackTrace();
}*/
//1. 校验用户是否有效
//update-begin-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false
LambdaQueryWrapper<PayContactsManagement> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PayContactsManagement::getPhone, username);
PayContactsManagement contactsManagement = payContactsManagementService.getOne(queryWrapper);
//update-end-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false
if (Objects.isNull(contactsManagement)) {
throw new JeroBootException("用户名或密码错误");
}
// 若用户名有效,则查询该账号的登陆失败次数是否符合等保要求
int retryCount = 0;
if (redisUtil.get(RETRY_LOGIN_PREFIX + username) != null) {
retryCount = (int) redisUtil.get(RETRY_LOGIN_PREFIX + username);
}
if (retryCount >= RETRY_LOGIN_MAX_COUNT) {
result.error500("密码错误次数过多,请稍后重试");
return result;
}
//2. 校验用户名或密码是否正确
String userpassword = PasswordUtil.encrypt(username, password, contactsManagement.getSalt());
String syspassword = contactsManagement.getPassword();
if (!syspassword.equals(userpassword)) {
// 重试登录次数加一
retryCount++;
if (retryCount == 1) {
redisUtil.set(RETRY_LOGIN_PREFIX + username, retryCount, 60 * 30);
} else {
redisUtil.set(RETRY_LOGIN_PREFIX + username, retryCount, redisUtil.getExpire(RETRY_LOGIN_PREFIX + username));
}
String msg = retryCount == RETRY_LOGIN_MAX_COUNT ? "密码错误次数过多,请稍后重试" : "用户名或密码错误,剩余可登录次数:" + (RETRY_LOGIN_MAX_COUNT - retryCount);
result.error500(msg);
return result;
}
//登录成功,清除错误登录次数
redisUtil.del(RETRY_LOGIN_PREFIX + username);
//用户登录信息
userInfo(contactsManagement, result);
//update-begin--Author:wangshuai Date:20200714 for:登录日志没有记录人员
LoginUser loginUser = new LoginUser();
BeanUtils.copyProperties(contactsManagement, loginUser);
baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null, loginUser);
//update-end--Author:wangshuai Date:20200714 for:登录日志没有记录人员
return result;
}
/**
* 用户信息
*
* @param contactsManagement
* @param result
* @return
*/
private void userInfo(PayContactsManagement contactsManagement, Result<JSONObject> result) {
String syspassword = contactsManagement.getPassword();
String username = contactsManagement.getPhone();
// 生成token
String token = JwtUtil.sign(username, syspassword);
// 设置token缓存有效时间
redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
// 获取用户部门信息
JSONObject obj = new JSONObject();
obj.put("token", token);
obj.put("userInfo", contactsManagement);
obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
result.setResult(obj);
result.success("登录成功");
}
}
@@ -35,6 +35,7 @@ import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -62,6 +63,8 @@ public class PayContactsManagementController extends JeroController<PayContactsM
private Environment env;
@Autowired
private ProjectCountService projectCountService;
@Value("${defaultPassword}")
private String defaultPassword;
// todo 缺少联系人加入到用户表,可以登录
@@ -161,6 +164,10 @@ public class PayContactsManagementController extends JeroController<PayContactsM
if (!StringUtils.isBlank(payContactsManagement.getEmail())){
payContactsManagement.setEmail(PasswordUtil.encrypt(payContactsManagement.getEmail()));
}
String salt = oConvertUtils.randomGen(8);
String passwordEncode = PasswordUtil.encrypt(payContactsManagement.getPhone(), defaultPassword, salt);
payContactsManagement.setSalt(salt);
payContactsManagement.setPassword(passwordEncode);
}catch (Exception e){
log.error("手机号、邮箱加密异常!",e);
}
@@ -5,7 +5,9 @@ import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.jero.common.aspect.annotation.Dict;
import com.jero.modules.system.volid.group.CreateGroup;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
@@ -106,4 +108,16 @@ public class PayContactsManagement implements Serializable {
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 密码
*/
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
/**
* md5密码盐
*/
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String salt;
}