From d0f4716cc3be517d6ed648006295027e3e7edc74 Mon Sep 17 00:00:00 2001 From: lijiarao Date: Wed, 22 Sep 2021 21:08:46 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E4=BC=81=E4=B8=9A=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=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/util/JwtUtil.java | 2 +- .../java/com/jero/common/util/TokenUtils.java | 1 + .../com/jero/config/shiro/ShiroConfig.java | 2 +- .../controller/CompanyLoginController.java | 162 ++++++++++++++++++ .../PayContactsManagementController.java | 7 + .../company/entity/PayContactsManagement.java | 14 ++ .../company/entity/PayContactsManagement.java | 123 +++++++++++++ .../modules/system/mapper/SysUserMapper.java | 3 + .../system/mapper/xml/SysUserMapper.xml | 5 + .../system/service/impl/SysBaseApiImpl.java | 16 +- 10 files changed, 328 insertions(+), 7 deletions(-) create mode 100644 jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyLoginController.java create mode 100644 jero-boot-module-system/src/main/java/com/jero/modules/pay/company/entity/PayContactsManagement.java diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java index 56c2952d..c8c113e1 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/system/util/JwtUtil.java @@ -90,7 +90,7 @@ public class JwtUtil { String accessToken = request.getHeader("X-Access-Token"); String username = getUsername(accessToken); if (oConvertUtils.isEmpty(username)) { - throw new JeroBootException("未获取到用户"); + throw new JeroBootException("未获取到用户"); } return username; } diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/TokenUtils.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/TokenUtils.java index 6b2eb6f4..feb0ae44 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/TokenUtils.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/TokenUtils.java @@ -114,6 +114,7 @@ public class TokenUtils { // 查询用户信息 LoginUser user = commonAPI.getUserByName(username); if (user == null) { + throw new AuthenticationException("用户不存在!"); } // 判断用户状态 diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java index e70dcef9..9361009f 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java @@ -107,7 +107,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/company/payContactsManagement/queryByName","anon");//联系人校验 filterChainDefinitionMap.put("/sys/common/download/**","anon");//下载接口 filterChainDefinitionMap.put("/sys/oss/file/queryById","anon");//通过id查询文件 - + filterChainDefinitionMap.put("/company/login", "anon"); //登录接口排除 filterChainDefinitionMap.put("/", "anon"); filterChainDefinitionMap.put("/doc.html", "anon"); diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyLoginController.java b/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyLoginController.java new file mode 100644 index 00000000..265c920c --- /dev/null +++ b/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyLoginController.java @@ -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 login(@RequestBody SysLoginModel sysLoginModel) { + Result 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 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 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("登录成功"); + } +} diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/PayContactsManagementController.java b/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/PayContactsManagementController.java index 28aaad78..c1e4b054 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/PayContactsManagementController.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/PayContactsManagementController.java @@ -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 { * @return */ List getRoleNameByUserIds(@Param("userIds") List userIds); + + PayContactsManagement getPayContactsManagementByPhone(@Param("username") String username); } diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml index 00a91f70..ae0359e3 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml @@ -199,4 +199,9 @@ #{id} + + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java index 0eb437a3..a77b6b6e 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.base.Joiner; import com.jero.modules.oss.mapper.OSSFileMapper; +import com.jero.modules.pay.company.entity.PayContactsManagement; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.shiro.SecurityUtils; @@ -95,7 +96,6 @@ public class SysBaseApiImpl implements ISysBaseAPI { private SysPermissionMapper sysPermissionMapper; @Autowired private ISysPermissionDataRuleService sysPermissionDataRuleService; - @Override @Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username") public LoginUser getUserByName(String username) { @@ -105,11 +105,17 @@ public class SysBaseApiImpl implements ISysBaseAPI { LoginUser loginUser = new LoginUser(); SysUser sysUser = userMapper.getUserByName(username); if(sysUser==null) { - return null; + PayContactsManagement contactsManagement = userMapper.getPayContactsManagementByPhone(username); + if (contactsManagement == null){ + return null; + }else { + BeanUtils.copyProperties(contactsManagement, loginUser); + } + }else { + BeanUtils.copyProperties(sysUser, loginUser); + List roleByUserName = sysUserRoleMapper.getRoleByUserName(username); + loginUser.setRoleCode(roleByUserName.get(0)); } - BeanUtils.copyProperties(sysUser, loginUser); - List roleByUserName = sysUserRoleMapper.getRoleByUserName(username); - loginUser.setRoleCode(roleByUserName.get(0)); return loginUser; }