lyhzzz 7 tháng trước cách đây
mục cha
commit
640b2cd7c3

+ 1 - 0
src/main/java/com/fdkankan/fusion/common/ResultCode.java

@@ -76,6 +76,7 @@ public enum ResultCode {
     CAMERA_VERSION_STATUS_ERROR(8027, "相机版本状态错误"),
 
     MEDIO_NOT_EXIT(8028, "媒体库文件不存在"),
+    AUTH_ERROR(8029, "授权访问失败"),
 
     ;
 

+ 75 - 0
src/main/java/com/fdkankan/fusion/common/util/AesUtil.java

@@ -0,0 +1,75 @@
+package com.fdkankan.fusion.common.util;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+
+public class AesUtil {
+
+    public static final String ALMODE_CBC_NOPADDING = "AES/CBC/NoPadding";
+
+    public AesUtil() {
+    }
+
+    public static String encryptAES(String data, String key, String iv) throws Exception {
+        return encryptCBC(data, key, iv, "AES/CBC/NoPadding");
+    }
+
+    public static String encryptCBC(String data, String key, String iv, String alMode) throws Exception {
+        Cipher cipher = Cipher.getInstance(alMode);
+        int blockSize = cipher.getBlockSize();
+        byte[] dataBytes = data.getBytes();
+        int plaintextLength = dataBytes.length;
+        if (plaintextLength % blockSize != 0) {
+            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(1, keyspec, ivspec);
+        byte[] encrypted = cipher.doFinal(plaintext);
+        return (new Base64()).encodeToString(encrypted).trim();
+    }
+
+    public static String decryptCBC(String data, String key, String iv, String alMode) throws Exception {
+        byte[] encrypted1 = (new Base64()).decode(data);
+        Cipher cipher = Cipher.getInstance(alMode);
+        SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
+        IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
+        cipher.init(2, keyspec, ivspec);
+        byte[] original = cipher.doFinal(encrypted1);
+        String originalString = new String(original);
+        return originalString.trim();
+    }
+
+    public static String encryptECB(String data, String key, String alMode) throws Exception {
+        byte[] raw = key.getBytes(StandardCharsets.UTF_8);
+        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
+        Cipher cipher = Cipher.getInstance(alMode);
+        cipher.init(1, skeySpec);
+        byte[] byteEncode = data.getBytes(StandardCharsets.UTF_8);
+        byte[] byteAes = cipher.doFinal(byteEncode, 0, byteEncode.length);
+        return java.util.Base64.getEncoder().encodeToString(byteAes);
+    }
+
+    public static String decryptECB(String data, String key, String alMode) throws Exception {
+        byte[] raw = key.getBytes(StandardCharsets.UTF_8);
+        Cipher cipher = Cipher.getInstance(alMode);
+        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
+        cipher.init(2, skeySpec);
+        byte[] encrypted1 = java.util.Base64.getDecoder().decode(data);
+        byte[] original = cipher.doFinal(encrypted1);
+        return (new String(original, StandardCharsets.UTF_8)).trim();
+    }
+
+    public static void main(String[] args) throws Exception {
+        String data = "linjunbo@192.168.0.30@1695872675";
+        String s = encryptECB(data, "3d8904474ebbdbbd81c5952524dad646", "AES/ECB/PKCS5Padding");
+        System.out.println(s);
+    }
+}

+ 18 - 0
src/main/java/com/fdkankan/fusion/common/util/SignUtil.java

@@ -0,0 +1,18 @@
+package com.fdkankan.fusion.common.util;
+
+import cn.hutool.core.util.StrUtil;
+import com.fdkankan.fusion.common.ResultCode;
+import com.fdkankan.fusion.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Objects;
+
+@Slf4j
+public class SignUtil {
+
+    public static String ENCRYPT_KEY = "3d8904474ebbdbbd81c5952524dad646";
+
+}

+ 66 - 2
src/main/java/com/fdkankan/fusion/config/SaTokenConfigure.java

@@ -7,14 +7,19 @@ import cn.dev33.satoken.exception.NotRoleException;
 import cn.dev33.satoken.filter.SaServletFilter;
 import cn.dev33.satoken.jwt.StpLogicJwtForMixin;
 import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.spring.SpringMVCUtil;
 import cn.dev33.satoken.stp.StpLogic;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.ServletUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.HttpMethod;
 import com.fdkankan.fusion.common.ResultCode;
 import com.fdkankan.fusion.common.ResultData;
+import com.fdkankan.fusion.common.util.AesUtil;
 import com.fdkankan.fusion.common.util.RedisKeyUtil;
+import com.fdkankan.fusion.common.util.SignUtil;
 import com.fdkankan.fusion.controller.LoginController;
 import com.fdkankan.fusion.exception.BusinessException;
 import com.fdkankan.fusion.httpClient.FdService;
@@ -30,7 +35,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import javax.servlet.http.HttpServletRequest;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.HashMap;
+import java.util.Objects;
 
 @Configuration
 @Slf4j
@@ -48,10 +57,17 @@ public class SaTokenConfigure {
                 .addInclude("/**").addExclude("/**/test/**","/**/inner/**","/**/notAuth/**","/**/systemSetting/**","/**/downMD5/**","/**/downDocx/**","/**ws/**")
                 // 认证函数: 每次请求执行
                 .setAuth(obj -> {
-                    SaRouter.match("/**", "/fdLogin", r ->checkLogin() );
+                    String sign = SaHolder.getRequest().getHeader("sign");
                     String pageType = SaHolder.getRequest().getHeader("page-type");
                     String caseId = SaHolder.getRequest().getHeader("caseId");
-                    SaRouter.match("/**", "/case/addScene", r ->checkCaseAuth(caseId,pageType));
+                    if(StringUtils.isNotBlank(sign)){
+                        String clientIP = ServletUtil.getClientIP(SpringMVCUtil.getRequest());
+                        SaRouter.match("/**", "/case/addScene", r -> checkSign(sign,clientIP));
+                    }else {
+                        SaRouter.match("/**", "/fdLogin", r ->checkLogin() );
+                        SaRouter.match("/**", "/case/addScene", r ->checkCaseAuth(caseId,pageType));
+                    }
+
 
                     SaRouter.match("/sceneDownLog/list", r -> StpUtil.checkRoleOr("admin-super","admin-system","admin") );
 
@@ -98,6 +114,7 @@ public class SaTokenConfigure {
                         aj = ResultData.error(ee.getCode(),ee.getMessage());
                     }
                     else {	// 普通异常, 输出:500 + 异常信息
+                        log.info("500",e);
                         aj = ResultData.error(ResultCode.SYSTEM_ERROR);
                     }
                     return JSONObject.toJSONString(aj);
@@ -146,6 +163,53 @@ public class SaTokenConfigure {
     }
 
 
+    public   void  checkSign(String sign,String remoteIp){
+        if(StringUtils.isBlank(sign)){
+            throw new BusinessException(ResultCode.AUTH_ERROR.code, "签名为空");
+        }
+        String userName = null, ip = null, timestamp = null;
+
+        if(StrUtil.isNotEmpty(sign)){
+            sign = sign.replaceAll("%2B", "+").replaceAll(" ", "+");
+            String[] split = null;
+            try {
+                String decode = AesUtil.decryptECB(sign, SignUtil.ENCRYPT_KEY, "AES/ECB/PKCS5Padding");
+                split = decode.split("@");
+
+            }catch (Exception e){
+                log.info("签名解密失败", e);
+                throw new BusinessException(ResultCode.AUTH_ERROR.code, "签名解密失败");
+            }
+
+            if(Objects.isNull(split) || split.length == 1){
+                throw new BusinessException(ResultCode.AUTH_ERROR.code, "签名参数错误");
+            }else{
+                for (int i = 0; i < split.length; i++){
+                    if(i == 0){
+                        userName = split[i];
+                    }
+                    if(i == 1){
+                        ip = split[i];
+                    }
+                    if(i == 2){
+                        timestamp = split[i];
+                    }
+                }
+
+                log.info("请求ip:{}", remoteIp);
+                log.info("参数ip:{}", ip);
+                if(StrUtil.isNotEmpty(ip) && !ip.equals(remoteIp)){
+                    throw new BusinessException(ResultCode.AUTH_ERROR.code, "ip不匹配");
+                }
+
+                if(StrUtil.isNotEmpty(timestamp) && Calendar.getInstance().getTime().after(new Date(Long.valueOf(timestamp) * 1000))){
+                    throw new BusinessException(ResultCode.AUTH_ERROR.code, "超出访问截止时间");
+                }
+            }
+        }
+    }
+
+
     //Sa-Token    整合 jwt
     //Stateless   无状态模式 纯jwt
     //Mixin       混入模式 jwt 与 Redis 逻辑混合

+ 3 - 0
src/main/java/com/fdkankan/fusion/entity/CaseTagPoint.java

@@ -86,4 +86,7 @@ public class CaseTagPoint implements Serializable {
 
     @TableField("visibility_range")
     private Integer visibilityRange;
+
+    @TableField("normal")
+    private String normal;
 }

+ 0 - 5
src/main/java/com/fdkankan/fusion/service/impl/SceneService.java

@@ -199,8 +199,6 @@ public class SceneService implements ISceneService {
         }
         Set<String> snCodes = sceneVoList.stream().map(SceneVo::getSnCode).collect(Collectors.toSet());
         List<SceneVo> modelingScene = sceneVoList.stream().filter(e -> e.getStatus() == 0).collect(Collectors.toList());
-        List<String> numList = modelingScene.stream().map(SceneVo::getNum).collect(Collectors.toList());
-        HashMap<String,Boolean> modelingMap =  mqSendLogService.getMapByNumList(numList);
 
         HashMap<String, TmDepartment> map = tmCameraService.getMapBySnCodes(snCodes);
         for (SceneVo sceneVo : sceneVoList) {
@@ -209,9 +207,6 @@ public class SceneService implements ISceneService {
                 sceneVo.setDeptId(tmDepartment.getId());
                 sceneVo.setDeptName(tmDepartment.getName());
             }
-            if(modelingMap.get(sceneVo.getNum()) != null && !modelingMap.get(sceneVo.getNum())){
-                sceneVo.setStatus(5);
-            }
         }
         Page<SceneVo> voPage = new Page<>(param.getPageNum(),param.getPageSize());
         voPage.setRecords(sceneVoList);