From cfe431f7938d40cbf2478119baa8a0eab9b746d6 Mon Sep 17 00:00:00 2001
From: zhanghua <314079846@qq.com>
Date: 星期五, 21 四月 2023 12:55:27 +0800
Subject: [PATCH] 登录时密码加密,记录登录错误次数

---
 ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java    |   23 +++++++
 ycl-platform/src/main/resources/application-dev.yml                            |    2 
 ycl-common/src/main/java/com/ycl/bo/AdminUserDetails.java                      |    5 +
 ycl-common/src/main/resources/mapper/user/UmsAdminMapper.xml                   |    2 
 ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java |    2 
 ycl-common/src/main/java/com/ycl/controller/user/UmsAdminController.java       |   32 ++++++----
 ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java                     |   10 +++
 ycl-common/src/main/java/com/ycl/utils/AesEncryptUtil.java                     |  100 +++++++++++++++++++++++++++++++++
 8 files changed, 160 insertions(+), 16 deletions(-)

diff --git a/ycl-common/src/main/java/com/ycl/bo/AdminUserDetails.java b/ycl-common/src/main/java/com/ycl/bo/AdminUserDetails.java
index 4f8975b..f609db8 100644
--- a/ycl-common/src/main/java/com/ycl/bo/AdminUserDetails.java
+++ b/ycl-common/src/main/java/com/ycl/bo/AdminUserDetails.java
@@ -13,6 +13,7 @@
 /**
  * SpringSecurity闇�瑕佺殑鐢ㄦ埛璇︽儏
  */
+
 public class AdminUserDetails implements UserDetails {
     private UmsAdmin umsAdmin;
     private List<UmsMenu> resourceList;
@@ -63,4 +64,8 @@
     public Long getUserId() {
         return umsAdmin.getId();
     }
+
+    public UmsAdmin getUmsAdmin() {
+        return umsAdmin;
+    }
 }
diff --git a/ycl-common/src/main/java/com/ycl/controller/user/UmsAdminController.java b/ycl-common/src/main/java/com/ycl/controller/user/UmsAdminController.java
index 3796ae0..25f8004 100644
--- a/ycl-common/src/main/java/com/ycl/controller/user/UmsAdminController.java
+++ b/ycl-common/src/main/java/com/ycl/controller/user/UmsAdminController.java
@@ -24,6 +24,7 @@
 import com.ycl.service.redis.RedisService;
 import com.ycl.service.user.UmsAdminService;
 import com.ycl.service.user.UmsMenuService;
+import com.ycl.utils.AesEncryptUtil;
 import com.ycl.utils.EasyExcelUtils;
 import com.ycl.utils.redis.RedisKey;
 import com.ycl.vo.user.UserVO;
@@ -80,8 +81,11 @@
     @ApiOperation(value = "鐧诲綍浠ュ悗杩斿洖token")
     @RequestMapping(value = "/login", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) {
-        String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword());
+    public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) throws Exception {
+        String password = AesEncryptUtil.desEncrypt(umsAdminLoginParam.getPassword());
+//        String password = umsAdminLoginParam.getPassword();
+        String token = adminService.login(umsAdminLoginParam.getUsername(), password);
+
         if (token == null) {
             return CommonResult.validateFailed("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
         }
@@ -161,6 +165,7 @@
     private DataDictionary2Mapper dataDictionary2Mapper;
     @Resource
     private UmsDepartMapper umsDepartMapper;
+
     @ApiOperation("鐢ㄦ埛瀵煎叆")
     @PostMapping("/import")
     public CommonResult importUser(MultipartFile file) throws IOException {
@@ -175,20 +180,20 @@
                         param.setNickName(item.getNickName());
 
                         String sex = item.getSex();
-                        if (sex.equals("鐢�")){
+                        if (sex.equals("鐢�")) {
                             param.setSex((byte) 1);
                         } else if (sex.equals("濂�")) {
                             param.setSex((byte) 0);
-                        }else {
+                        } else {
                             throw new RuntimeException("鎬у埆杈撳叆鏈夎");
                         }
 
                         String isDy = item.getIsDy();
-                        if (isDy.equals("鏄�")){
+                        if (isDy.equals("鏄�")) {
                             param.setSex((byte) 1);
                         } else if (isDy.equals("鍚�")) {
                             param.setSex((byte) 0);
-                        }else {
+                        } else {
                             throw new RuntimeException("鍏氬憳杈撳叆鏈夎");
                         }
 
@@ -197,9 +202,9 @@
 
                         String role = item.getRole();
                         UmsRole umsRole = umsRoleMapper.selectOne(new LambdaQueryWrapper<UmsRole>().eq(UmsRole::getName, role));
-                        if (Objects.isNull(umsRole)){
+                        if (Objects.isNull(umsRole)) {
                             param.setRoleIds(null);
-                        }else {
+                        } else {
                             List list = new ArrayList<>();
                             list.add(umsRole.getId());
                             param.setRoleIds(list);
@@ -207,17 +212,17 @@
 
                         String userType = item.getUserType();
                         DataDictionary dataDictionary = dataDictionary2Mapper.selectOne(new LambdaQueryWrapper<DataDictionary>().eq(DataDictionary::getName, userType));
-                        if (Objects.isNull(dataDictionary)){
+                        if (Objects.isNull(dataDictionary)) {
                             throw new RuntimeException("鐢ㄦ埛绫诲瀷涓嶅瓨鍦�");
-                        }else {
+                        } else {
                             param.setUserType(dataDictionary.getId().intValue());
                         }
 
                         String department = item.getDepartment();
                         UmsDepart umsDepart = umsDepartMapper.selectOne(new LambdaQueryWrapper<UmsDepart>().eq(UmsDepart::getDepartName, department));
-                        if (Objects.isNull(umsDepart)){
+                        if (Objects.isNull(umsDepart)) {
                             throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
-                        }else {
+                        } else {
                             param.setDepartmentId(umsDepart.getId());
                         }
 
@@ -234,7 +239,6 @@
                 }).sheet().doRead();
         return CommonResult.success(true, "瀵煎叆鎴愬姛");
     }
-
 
 
     @ApiOperation("鑾峰彇鎸囧畾鐢ㄦ埛淇℃伅")
@@ -271,7 +275,7 @@
             return CommonResult.failed("鎵句笉鍒拌鐢ㄦ埛");
         } else if (status == -3) {
             return CommonResult.failed("鏃у瘑鐮侀敊璇�");
-        }else if (status == -4) {
+        } else if (status == -4) {
             return CommonResult.failed("瀵嗙爜涓嶈兘鍜岀櫥褰曞悕瀹屽叏涓�鑷�");
         } else {
             return CommonResult.failed();
diff --git a/ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java b/ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java
index 47eda99..79ef1cd 100644
--- a/ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java
+++ b/ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java
@@ -10,8 +10,10 @@
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
+import org.joda.time.DateTime;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -99,6 +101,14 @@
     @ApiModelProperty(value = "鏄惁涓虹綉鏍肩鐞嗗憳锛�0->涓嶆槸锛�1->鏄�")
     private Integer isGrid;
 
+    @ApiModelProperty(value = "鏄惁涓虹綉鏍肩鐞嗗憳锛�0->涓嶆槸锛�1->鏄�")
+    @TableField("password_error_num")
+    private Integer passwordErrorNum;
+
+    @ApiModelProperty(value = "鏄惁涓虹綉鏍肩鐞嗗憳锛�0->涓嶆槸锛�1->鏄�")
+    @TableField("password_error_last_time")
+    private LocalDateTime passwordErrorLastTime;
+
     @ApiModelProperty(value = "鍏抽敭瀛楁")
     @TableField(exist = false)
     private String keyword;
diff --git a/ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java b/ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java
index c8235e2..3b459dd 100644
--- a/ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java
+++ b/ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ycl.service.user.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.PageUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.druid.sql.PagerUtils;
@@ -49,6 +50,7 @@
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
@@ -258,12 +260,31 @@
         //瀵嗙爜闇�瑕佸鎴风鍔犲瘑鍚庝紶閫�
         try {
             AdminUserDetails userDetails = (AdminUserDetails) loadUserByUsername(username);
+
+            UmsAdmin admin = userDetails.getUmsAdmin();
+            LocalDateTime nowTime = LocalDateTime.now();
+            nowTime = nowTime.plusMinutes(-15);
+            if (admin.getPasswordErrorNum() != null && admin.getPasswordErrorNum() >= 5
+                    && admin.getPasswordErrorLastTime().isAfter(nowTime)) {
+                admin.setPasswordErrorLastTime(LocalDateTime.now());
+                updateById(admin);
+                Asserts.fail("鐧诲綍澶辫触瓒呰繃5娆★紝姝よ处鍙疯閿佸畾锛岃15鍒嗛挓鍚庡啀璇曘��");
+            }
             if (!passwordEncoder.matches(password, userDetails.getPassword())) {
+                if (admin.getPasswordErrorNum() == null) {
+                    admin.setPasswordErrorNum(1);
+                } else {
+                    admin.setPasswordErrorNum(admin.getPasswordErrorNum() + 1);
+                }
+                admin.setPasswordErrorLastTime(LocalDateTime.now());
+                updateById(admin);
                 Asserts.fail("瀵嗙爜涓嶆纭�");
             }
             if (!userDetails.isEnabled()) {
                 Asserts.fail("甯愬彿宸茶绂佺敤");
             }
+            admin.setPasswordErrorNum(0);
+            updateById(admin);
 
             UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
             SecurityContextHolder.getContext().setAuthentication(authentication);
@@ -430,7 +451,7 @@
             List<UmsMenu> resourceList = getResourceList(admin.getId());
             return new AdminUserDetails(admin, resourceList);
         }
-        throw new UsernameNotFoundException("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
+        throw new UsernameNotFoundException("鐢ㄦ埛涓嶅瓨鍦�");
     }
 
     @Override
diff --git a/ycl-common/src/main/java/com/ycl/utils/AesEncryptUtil.java b/ycl-common/src/main/java/com/ycl/utils/AesEncryptUtil.java
new file mode 100644
index 0000000..168efc6
--- /dev/null
+++ b/ycl-common/src/main/java/com/ycl/utils/AesEncryptUtil.java
@@ -0,0 +1,100 @@
+package com.ycl.utils;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+public class AesEncryptUtil {
+    //浣跨敤AES-128-CBC鍔犲瘑妯″紡锛宬ey闇�瑕佷负16浣�,key鍜宨v鍙互鐩稿悓锛�
+    private static String KEY = "1234567890123456";
+
+    private static String IV = "1234567890123456";
+
+
+    /**
+     * 鍔犲瘑鏂规硶
+     * @param data  瑕佸姞瀵嗙殑鏁版嵁
+     * @param key 鍔犲瘑key
+     * @param iv 鍔犲瘑iv
+     * @return 鍔犲瘑鐨勭粨鏋�
+     * @throws Exception
+     */
+    public static String encrypt(String data, String key, String iv) throws Exception {
+        try {
+
+            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"绠楁硶/妯″紡/琛ョ爜鏂瑰紡"NoPadding PkcsPadding
+            int blockSize = cipher.getBlockSize();
+
+            byte[] dataBytes = data.getBytes();
+            int plaintextLength = dataBytes.length;
+            if (plaintextLength % blockSize != 0) {
+                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
+            }
+
+            byte[] plaintext = new byte[plaintextLength];
+            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
+
+            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
+            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
+
+            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
+            byte[] encrypted = cipher.doFinal(plaintext);
+
+            return new Base64().encodeToString(encrypted);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 瑙e瘑鏂规硶
+     * @param data 瑕佽В瀵嗙殑鏁版嵁
+     * @param key  瑙e瘑key
+     * @param iv 瑙e瘑iv
+     * @return 瑙e瘑鐨勭粨鏋�
+     * @throws Exception
+     */
+    public static String desEncrypt(String data, String key, String iv) throws Exception {
+        try {
+            byte[] encrypted1 = new Base64().decode(data);
+
+            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
+            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
+
+            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
+
+            byte[] original = cipher.doFinal(encrypted1);
+            String originalString = new String(original);
+            return originalString.trim();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 浣跨敤榛樿鐨刱ey鍜宨v鍔犲瘑
+     * @param data
+     * @return
+     * @throws Exception
+     */
+    public static String encrypt(String data) throws Exception {
+        return encrypt(data, KEY, IV);
+    }
+
+    /**
+     * 浣跨敤榛樿鐨刱ey鍜宨v瑙e瘑
+     * @param data
+     * @return
+     * @throws Exception
+     */
+    public static String desEncrypt(String data) throws Exception {
+        return desEncrypt(data, KEY, IV);
+    }
+
+}
diff --git a/ycl-common/src/main/resources/mapper/user/UmsAdminMapper.xml b/ycl-common/src/main/resources/mapper/user/UmsAdminMapper.xml
index f422638..69778c7 100644
--- a/ycl-common/src/main/resources/mapper/user/UmsAdminMapper.xml
+++ b/ycl-common/src/main/resources/mapper/user/UmsAdminMapper.xml
@@ -23,6 +23,8 @@
         <result column="zj" property="zj"/>
         <result column="mobile" property="mobile"/>
         <result column="expiration_date" property="expirationDate"/>
+        <result column="password_error_num" property="passwordErrorNum"/>
+        <result column="password_error_last_time" property="passwordErrorLastTime" />
     </resultMap>
     <resultMap type="com.ycl.entity.user.UmsAdmin" id="CondMapResultMap" extends="BaseResultMap">
         <collection property="depart" javaType="ArrayList" ofType="com.ycl.entity.depart.UmsDepart">
diff --git a/ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java b/ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
index 83980a1..70ba109 100644
--- a/ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
+++ b/ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
@@ -1,6 +1,7 @@
 package com.ycl.controller.platformApi;
 
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.ycl.annotation.LogSave;
 import com.ycl.api.CommonResult;
 import com.ycl.dto.video.AlarmParam;
 import com.ycl.enums.common.ResultCode;
@@ -46,6 +47,7 @@
 
     @ApiOperation("瑙嗛鎶ヨ鎺ㄩ�丄PI")
     @PostMapping("/AlarmReport")
+    @LogSave(operationType = "鎶ヨ绠$悊", contain = "瑙嗛鎶ヨ鎺ㄩ��")
     public CommonResult alarmReport(@RequestBody @Validated AlarmParam alarmParam) {
         videoAlarmReportService.save(alarmParam);
         return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage());
diff --git a/ycl-platform/src/main/resources/application-dev.yml b/ycl-platform/src/main/resources/application-dev.yml
index 1a441d0..7f25105 100644
--- a/ycl-platform/src/main/resources/application-dev.yml
+++ b/ycl-platform/src/main/resources/application-dev.yml
@@ -35,7 +35,7 @@
         timeout: 0
 
   datasource:
-    url: jdbc:mysql://42.193.1.25:3306/sccg0318?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
+    url: jdbc:mysql://42.193.1.25:3306/sccg?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
     username: root
     password: 321$YcYl@1970!
     type: com.alibaba.druid.pool.DruidDataSource

--
Gitblit v1.8.0