zero 11 ماه پیش
والد
کامیت
15dc09cff3

+ 1 - 1
PCS/src/main/java/cn/cslg/permission/common/model/vo/LoginVO.java

@@ -34,7 +34,7 @@ public class LoginVO {
     private String password;
 
     /**
-     * 登录系统(0权限系统1分析系统2报告系统)
+     * 登录系统(0权限系统1分析系统2报告系统3窍笔系统)
      */
     private Integer loginSystem;
 

+ 52 - 14
PCS/src/main/java/cn/cslg/permission/service/LoginService.java

@@ -27,7 +27,6 @@ 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;
@@ -353,11 +352,13 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
     }
 
     //校验登录时参数
-    public EncryptionLoginVO loginCommonMethod(LoginCommonDTO vo, Personnel personnel) throws Exception {
+    public EncryptionLoginVO loginCommonMethod(LoginCommonDTO vo, Personnel personnel,LoginRecordVO loginRecordVO) throws Exception {
         Integer personnelId = personnel.getId();
         List<AssoPersonVipType> personVipTypes = assoPersonVipTypeMapper.selectList(new LambdaQueryWrapper<AssoPersonVipType>()
                 .eq(AssoPersonVipType::getPersonId, personnelId));
         if (org.springframework.util.CollectionUtils.isEmpty(personVipTypes)) {
+            loginRecordVO.setLoginResult("无权限");
+            loginRecordService.addLoginRecord(loginRecordVO);
             throw new XiaoShiException(ExceptionEnum.PERMISSION_ERROR);
         }
         Long timeMillis = vo.getCurrentTimeMillis();
@@ -368,27 +369,35 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         long currentTimeSecond = System.currentTimeMillis() / 1000;
         final long second = currentTimeSecond - currentTimeMillis;
         if (second > 30) {
+            loginRecordVO.setLoginResult("请求时间超时");
+            loginRecordService.addLoginRecord(loginRecordVO);
             throw new XiaoShiException(ExceptionEnum.THE_REQUEST_TIME_OVERTIME);
         }
         String appSecret = appKey + currentTimeMillis;
         String md5Sign = SecureUtil.md5(appSecret);
         if (Boolean.TRUE.equals(StringUtils.isEmpty(sign)) || !sign.equals(md5Sign)) {
+            loginRecordVO.setLoginResult("请求SIGN不一致,重新检查");
+            loginRecordService.addLoginRecord(loginRecordVO);
             throw new XiaoShiException(ExceptionEnum.THE_SIGN_IS_NOT_SAME);
         }
         if (Boolean.TRUE.equals(StringUtils.isEmpty(machineCode))) {
+            loginRecordVO.setLoginResult("机器码不可为空");
+            loginRecordService.addLoginRecord(loginRecordVO);
             throw new XiaoShiException(ExceptionEnum.THE_MACHINE_CODE_IS_NULL);
         }
 
-        //人员信息中私钥或公钥为空则添加进去
-        this.updatePersonnel(personnel.getPrivateKey(), personnel.getPublicKey(), personnel.getSymmetryKey(), personnelId);
-
-        personnel = personnelMapper.selectById(personnel.getId());
         List<AssoPersonnelMachine> machineList = assoPersonnelMachineMapper.selectList(new LambdaQueryWrapper<AssoPersonnelMachine>()
                 .eq(AssoPersonnelMachine::getPersonnelId, personnelId)
                 .ne(AssoPersonnelMachine::getMachineCode, SecureUtil.md5(machineCode)));
         if (machineList.size() > 1) {
+            loginRecordVO.setLoginResult("同一账号新机登录不可超过两个");
+            loginRecordService.addLoginRecord(loginRecordVO);
             throw new XiaoShiException(ExceptionEnum.DO_NOT_LOG_IN_TO_MORE_THAN_TWO_NEW_MACHINES_WITH_THE_SAME_ACCOUNT);
         }
+        //人员信息中私钥或公钥为空则添加进去
+        this.updatePersonnel(personnel.getPrivateKey(), personnel.getPublicKey(), personnel.getSymmetryKey(), personnelId);
+        personnel = personnelMapper.selectById(personnel.getId());
+        //添加人员和机器关联
         this.addOrUpdatePersonnelMachine(machineCode, personnel);
 
         EncryptionLoginVO loginVO = new EncryptionLoginVO();
@@ -404,9 +413,29 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         loginVO.setToken(StpUtil.getTokenValue());
         PersonVipMessVO personVipMessVO = assoPersonVipTypeService.getPersonVipMessage(personnelId);
         loginVO.setPersonVipMessVO(personVipMessVO);
+        loginRecordVO.setLoginResult("成功");
+        loginRecordService.addLoginRecord(loginRecordVO);
         return loginVO;
     }
 
+    public void addLoginRecord(Personnel personnel,LoginRecordVO loginRecordVO) {
+        loginRecordVO.setLoginSystem(3);
+        loginRecordVO.setPersonnelId(personnel.getId());
+        loginRecordVO.setTenantId(personnel.getTenantId());
+        //登录日志记录ip地址
+        loginRecordVO.setLoginIp(request.getRemoteAddr());
+        String ua = request.getHeader("User-Agent");
+        UserAgent userAgent = UserAgent.parseUserAgentString(ua);
+        //获取客户端操作系统
+        String os = userAgent.getOperatingSystem().getName();
+        //获取客户端浏览器
+        String browser = userAgent.getBrowser().getName();
+        //登录日志记录操作系统
+        loginRecordVO.setLoginOs(os);
+        //解析浏览器
+        loginRecordVO.setBrowser(browser);
+    }
+
     /**
      * 登录加密
      *
@@ -414,7 +443,7 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
      * @return
      * @throws Exception
      */
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
+//    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
     public String loginByEncryption(EncryptionLoginDTO vo) throws Exception {
         final String username = vo.getUsername();
         final String password = vo.getPassword();
@@ -431,12 +460,18 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         if (ObjectUtils.isEmpty(personnel)) {
             throw new XiaoShiException(ExceptionEnum.THE_PERSONNEL_IS_NOT_EXIST);
         }
+        LoginRecordVO loginRecordVO = new LoginRecordVO();
+        this.addLoginRecord(personnel, loginRecordVO);
         if (personnel.getPersonnelStatus().equals(0)) {
+            loginRecordVO.setLoginResult("该用户不可用");
+            loginRecordService.addLoginRecord(loginRecordVO);
             throw new XiaoShiException(ExceptionEnum.THE_PERSONNEL_IS_FORBIDDEN);
         }
         //校验密码是否正确
         boolean isPassword = personnel.getPersonnelPassword().equals(SecureUtil.md5(password));
         if (!isPassword) {
+            loginRecordVO.setLoginResult("密码错误");
+            loginRecordService.addLoginRecord(loginRecordVO);
             //登录日志记录登录是否成功
             throw new XiaoShiException(ExceptionEnum.LOGIN_PASSWORD_MISTAKE);
         }
@@ -445,10 +480,11 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         commonDTO.setSign(vo.getSign());
         commonDTO.setCurrentTimeMillis(vo.getCurrentTimeMillis());
         commonDTO.setMachineCode(vo.getMachineCode());
-        EncryptionLoginVO loginVO = this.loginCommonMethod(commonDTO, personnel);
+        EncryptionLoginVO loginVO = this.loginCommonMethod(commonDTO, personnel,loginRecordVO);
         return Response.success(loginVO);
     }
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
     public void updatePersonnel(String privateKey, String publicKey, String symmetryKey, Integer personId) throws Exception {
         if (StringUtils.isEmpty(privateKey) || StringUtils.isEmpty(publicKey) || Boolean.TRUE.equals(StringUtils.isEmpty(symmetryKey))) {
             Map<String, String> map = RSAUtils.generateKey();
@@ -468,9 +504,9 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
      *
      * @param machineCode
      * @param personnel
-     * @return
      */
-    private boolean addOrUpdatePersonnelMachine(String machineCode, Personnel personnel) {
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
+    public void addOrUpdatePersonnelMachine(String machineCode, Personnel personnel) {
         AssoPersonnelMachine machine = assoPersonnelMachineMapper.selectOne(new LambdaQueryWrapper<AssoPersonnelMachine>()
                 .eq(AssoPersonnelMachine::getMachineCode, SecureUtil.md5(machineCode))
                 .eq(AssoPersonnelMachine::getPersonnelId, personnel.getId()));
@@ -482,12 +518,10 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
             assoPersonnelMachine.setCreateUser(personnel.getCreateUser());
             assoPersonnelMachine.setCreateTime(new Date());
             assoPersonnelMachine.insert();
-            return true;
         } else {
             machine.setId(machine.getId());
             machine.setIfFirstActivation(false);
             machine.updateById();
-            return false;
         }
     }
 
@@ -634,7 +668,7 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
      * @param dto
      * @return
      */
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
+//    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
     public String loginByPhone(PhoneLoginDTO dto) throws Exception {
         //获取缓存中验证码
         String code = redisUtil.get(LoginCacheKeyUtil.getLoginCaptcha(dto.getPhoneNum()));
@@ -660,7 +694,11 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         if (org.apache.commons.lang3.ObjectUtils.isEmpty(person)) {
             throw new XiaoShiException(ExceptionEnum.THE_PERSONNEL_IS_NOT_EXIST);
         }
+        LoginRecordVO loginRecordVO = new LoginRecordVO();
+        this.addLoginRecord(person, loginRecordVO);
         if (person.getPersonnelStatus().equals(0)) {
+            loginRecordVO.setLoginResult("该用户不可用");
+            loginRecordService.addLoginRecord(loginRecordVO);
             throw new XiaoShiException(ExceptionEnum.THE_PERSONNEL_IS_FORBIDDEN);
         }
         LoginCommonDTO commonDTO = new LoginCommonDTO();
@@ -668,7 +706,7 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         commonDTO.setSign(dto.getSign());
         commonDTO.setCurrentTimeMillis(dto.getCurrentTimeMillis());
         commonDTO.setMachineCode(dto.getMachineCode());
-        EncryptionLoginVO loginVO = this.loginCommonMethod(commonDTO, person);
+        EncryptionLoginVO loginVO = this.loginCommonMethod(commonDTO, person, loginRecordVO);
         return Response.success(loginVO);
     }
 

+ 5 - 5
PCS/src/test/java/cn/cslg/permission/EncryptionPersonTest.java

@@ -32,10 +32,10 @@ public class EncryptionPersonTest {
     private PersonnelService personnelService;
 
     @Test
-    public void test() throws Exception {
+    public void loginByEncryption() throws Exception {
         EncryptionLoginDTO vo = new EncryptionLoginDTO();
-        vo.setUsername("zhangsansan");
-        vo.setPassword("12343545");
+        vo.setUsername("gaochangkui-qy");
+        vo.setPassword("Xiaoshi221101*");
         vo.setAppKey("4e95e3d926a2a4befa5d913acc0aa9f5");
 //        vo.setMachineCode("BDACEARQ1241241");
         vo.setMachineCode("BFEBFBFF000A0654");
@@ -49,7 +49,7 @@ public class EncryptionPersonTest {
     }
 
     @Test
-    public void test11() throws Exception {
+    public void functionByEncryption() throws Exception {
         final long timeMillis = System.currentTimeMillis();
         String appSecret = "4e95e3d926a2a4befa5d913acc0aa9f5" + timeMillis / 1000;
         String md5Sign = SecureUtil.md5(appSecret);
@@ -101,7 +101,7 @@ public class EncryptionPersonTest {
     public void loginByPhone() throws Exception {
         PhoneLoginDTO vo = new PhoneLoginDTO();
         vo.setPhoneNum("15705220533");
-        vo.setPhoneCode("354711");
+        vo.setPhoneCode("923331");
         vo.setAppKey("4e95e3d926a2a4befa5d913acc0aa9f5");
         vo.setMachineCode("BFEBFBFF000A0654");
         final long timeMillis = System.currentTimeMillis();