From cb24b03b70d287e4fc1585077887539156cd2e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=9D=E5=87=AF=E5=85=B4?= <985571137@qq.com> Date: Tue, 26 Jul 2022 11:07:37 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=81=E4=B8=9A=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jero/common/system/vo/LoginUser.java | 7 +- .../CompanyManagerLoginController.java | 237 ++++++++++++++++++ .../company/entity/PayManagerManagement.java | 6 + 3 files changed, 249 insertions(+), 1 deletion(-) diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/LoginUser.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/LoginUser.java index b4c063de..73878216 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/LoginUser.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/vo/LoginUser.java @@ -78,7 +78,7 @@ public class LoginUser { * 状态(1:正常 2:冻结 ) */ private Integer status; - + private Integer delFlag; /** * 同步工作流引擎1同步0不同步 @@ -133,4 +133,9 @@ public class LoginUser { */ private Boolean isCompanyUser; + /** + * 是否是企业管理员 + */ + private Boolean isCompanyManager; + } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyManagerLoginController.java b/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyManagerLoginController.java index bc14e3af..3941ee0b 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyManagerLoginController.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyManagerLoginController.java @@ -1,10 +1,46 @@ package com.jero.company.controller; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.CommonUtils; +import com.jero.common.util.MD5Util; +import com.jero.common.util.PasswordUtil; +import com.jero.common.util.RedisUtil; +import com.jero.company.entity.PayCompanyManagement; +import com.jero.company.entity.PayContactsManagement; +import com.jero.company.entity.PayManagerManagement; +import com.jero.company.mapper.WxSecretMapper; +import com.jero.company.service.IPayCompanyManagementService; +import com.jero.company.service.IPayContactsManagementService; +import com.jero.company.service.IPayManagerManagementService; +import com.jero.data.entity.PayCaseCouncilSubitem; +import com.jero.data.service.IPayCaseCouncilSubitemService; +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.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; +import java.util.Objects; + /** * @Description: 企业端管理员登录 * @author: Kuang Kaixing @@ -15,5 +51,206 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "企业端管理员登录") @Slf4j public class CompanyManagerLoginController { + @Autowired + private RedisUtil redisUtil; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private IPayManagerManagementService payManagerManagementService; + @Autowired + private IPayCompanyManagementService payCompanyManagementService; + @Autowired + private ISysDictService sysDictService; + @Resource + private BaseCommonService baseCommonService; + @Value("${defaultPassword}") + private String defaultPassword; + /** + * 密码登录错误的次数前缀 + */ + public static final String RETRY_LOGIN_PREFIX = "login:retryLoginCount_"; + /** + * 密码登录错误的最大限制次数 + */ + public static final int RETRY_LOGIN_MAX_COUNT = 5; + @Value("${passwordResetTime}") + private int passwordResetTime; + + @ApiOperation("登录接口") + @PostMapping(value = "/login") + public Result login(@RequestBody SysLoginModel sysLoginModel) { + Result result = new Result<>(); + String phone = 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); + phone = CommonUtils.decryptBtRsaPriKey(phone, rsaPrivateKey); + } catch (Exception e) { + e.printStackTrace(); + } + //1. 校验用户是否有效 + //update-begin-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PayManagerManagement::getPhone, PasswordUtil.encrypt(phone)); + queryWrapper.eq(PayManagerManagement::getDelFlag, 0); + PayManagerManagement managerManagement = payManagerManagementService.getOne(queryWrapper); + //update-end-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false + if (Objects.isNull(managerManagement)) { + throw new JeroBootException("手机号或密码错误"); + }else { + if (StringUtils.isBlank(managerManagement.getPassword())){ + throw new JeroBootException("请先用手机验证码登录"); + } + } + + // 若用户名有效,则查询该账号的登陆失败次数是否符合等保要求 + int retryCount = 0; + if (redisUtil.get(RETRY_LOGIN_PREFIX + phone) != null) { + retryCount = (int) redisUtil.get(RETRY_LOGIN_PREFIX + phone); + } + if (retryCount >= RETRY_LOGIN_MAX_COUNT) { + result.error500("密码错误次数过多,密码错误次数过多,请"+passwordResetTime+"分钟后重试"); + return result; + } + //2. 校验用户名或密码是否正确 + String userpassword = PasswordUtil.encrypt(phone, password, managerManagement.getSalt()); + String syspassword = managerManagement.getPassword(); + if (!syspassword.equals(userpassword)) { + // 重试登录次数加一 + retryCount++; + if (retryCount == 1) { + redisUtil.set(RETRY_LOGIN_PREFIX + phone, retryCount, 60L * passwordResetTime); + } else { + redisUtil.set(RETRY_LOGIN_PREFIX + phone, retryCount, redisUtil.getExpire(RETRY_LOGIN_PREFIX + phone)); + } + String msg = retryCount == RETRY_LOGIN_MAX_COUNT ? "密码错误次数过多,请"+passwordResetTime+"分钟后重试" : "手机号或密码错误,剩余可登录次数:" + (RETRY_LOGIN_MAX_COUNT - retryCount); + result.error500(msg); + return result; + } + //登录成功,清除错误登录次数 + redisUtil.del(RETRY_LOGIN_PREFIX + phone); + + //用户登录信息 + userInfo(managerManagement, result); + //update-begin--Author:wangshuai Date:20200714 for:登录日志没有记录人员 + LoginUser loginUser = new LoginUser(); + BeanUtils.copyProperties(managerManagement, loginUser); + loginUser.setUsername(managerManagement.getName()); + loginUser.setRealname(managerManagement.getName()); + loginUser.setRoleCode("企业用户"); + loginUser.setIsCompanyManager(true); + baseCommonService.addLog("手机号: " + phone + ",登录成功!", CommonConstant.LOG_TYPE_1, null, loginUser); + //update-end--Author:wangshuai Date:20200714 for:登录日志没有记录人员 + return result; + } + + @ApiOperation("短信登录接口") + @PostMapping(value = "/smsLogin") + public Result smsLogin(@RequestBody SysLoginModel sysLoginModel) { + Result result = new Result<>(); + String phone = sysLoginModel.getUsername(); + String rsaPublicKey = sysLoginModel.getRsaPublicKey(); + String rsaPrivateKey = String.valueOf(redisUtil.get(rsaPublicKey)); + try { + //解密获取手机号和openId + phone = CommonUtils.decryptBtRsaPriKey(phone, rsaPrivateKey); + } catch (Exception e) { + e.printStackTrace(); + } + String captcha = sysLoginModel.getCaptcha(); + if (captcha == null) { + result.error500("验证码无效"); + return result; + } + Object checkCode = redisUtil.get("_verification:_phone:" + phone); + if (checkCode == null || !Objects.equals(checkCode,captcha)) { + result.error500("验证码错误"); + return result; + } else { + redisUtil.del("_verification:_phone:" + phone); + } + + //1. 校验用户是否有效 + //update-begin-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PayManagerManagement::getPhone, PasswordUtil.encrypt(phone)); + PayManagerManagement managerManagement = payManagerManagementService.getOne(queryWrapper); + //update-end-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false + if (Objects.isNull(managerManagement)) { + throw new JeroBootException("手机号不存在"); + } + + //用户登录信息 + userInfo(managerManagement, result); + //update-begin--Author:wangshuai Date:20200714 for:登录日志没有记录人员 + LoginUser loginUser = new LoginUser(); + loginUser.setIsCompanyManager(true); + BeanUtils.copyProperties(managerManagement, loginUser); + baseCommonService.addLog("手机号: " + phone + ",登录成功!", CommonConstant.LOG_TYPE_1, null, loginUser); + //update-end--Author:wangshuai Date:20200714 for:登录日志没有记录人员 + + //如果没有密码,返回 + if (Objects.isNull(managerManagement.getPassword())){ + result.setMessage("updatePassword"); + } + return result; + } + + /** + * 用户信息 + */ + private void userInfo(PayManagerManagement managerManagement, Result result) { + String syspassword = managerManagement.getPassword(); + String phone = managerManagement.getPhone(); + managerManagement.setPhone(PasswordUtil.decrypt(phone)); + if (Objects.isNull(syspassword)) { + syspassword = defaultPassword; + } + + //判断企业角色 + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.eq("id",managerManagement.getCompanyId()); + PayCompanyManagement one = payCompanyManagementService.getOne(queryWrapper2); + if(ObjectUtils.isEmpty(one)){ + throw new JeroBootException("联系人无企业信息"); + }else { + managerManagement.setCompanyRole(one.getRoleCode()); + } + // 生成token + String token = JwtUtil.sign(phone, 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", managerManagement); + obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); + result.setResult(obj); + result.success("登录成功"); + } } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/company/entity/PayManagerManagement.java b/jero-boot-incoming-payment/src/main/java/com/jero/company/entity/PayManagerManagement.java index 1a13e9bc..6d3b109e 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/company/entity/PayManagerManagement.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/company/entity/PayManagerManagement.java @@ -5,6 +5,7 @@ import java.util.Date; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -151,4 +152,9 @@ public class PayManagerManagement implements Serializable { @ApiModelProperty(value = "会员企业id") private String memberId; + /**企业角色1:普通企业、2:会员企业*/ + @TableField(exist = false) + @ApiModelProperty(value = "企业角色1:普通企业、2:会员企业") + private String companyRole; + }