TRX пре 1 година
родитељ
комит
e9f7fc73bc
24 измењених фајлова са 632 додато и 23 уклоњено
  1. 23 0
      src/main/java/com/zswl/dataservice/auth/FilterConfig.java
  2. 20 0
      src/main/java/com/zswl/dataservice/auth/OpenAPIContext.java
  3. 26 2
      src/main/java/com/zswl/dataservice/auth/OpenAPIInterceptor.java
  4. 46 0
      src/main/java/com/zswl/dataservice/auth/RequestCachingFilter.java
  5. 1 0
      src/main/java/com/zswl/dataservice/auth/UserContextInterceptor.java
  6. 64 0
      src/main/java/com/zswl/dataservice/controller/openApi/BlackListController.java
  7. 13 2
      src/main/java/com/zswl/dataservice/controller/openApi/SystemTimeController.java
  8. 4 0
      src/main/java/com/zswl/dataservice/dao/mqtt/impl/OperationLogsDaoImpl.java
  9. 20 0
      src/main/java/com/zswl/dataservice/dao/openApi/BlackListDao.java
  10. 17 0
      src/main/java/com/zswl/dataservice/dao/openApi/extend/BlackListDaoExtend.java
  11. 59 0
      src/main/java/com/zswl/dataservice/dao/openApi/impl/BlackListDaoImpl.java
  12. 4 0
      src/main/java/com/zswl/dataservice/domain/mqtt/OperationLogs.java
  13. 25 0
      src/main/java/com/zswl/dataservice/domain/openApi/BlackList.java
  14. 19 0
      src/main/java/com/zswl/dataservice/model/openApi/blackList/BlackListModel.java
  15. 22 0
      src/main/java/com/zswl/dataservice/model/openApi/blackList/BlackListParam.java
  16. 22 0
      src/main/java/com/zswl/dataservice/model/openApi/blackList/BlackListSearch.java
  17. 13 0
      src/main/java/com/zswl/dataservice/model/operLogs/OperationLogsModel.java
  18. 4 0
      src/main/java/com/zswl/dataservice/model/operLogs/OperationLogsSearchParam.java
  19. 116 0
      src/main/java/com/zswl/dataservice/service/openApi/BlackListService.java
  20. 54 18
      src/main/java/com/zswl/dataservice/service/openApi/OpenApiVerifyService.java
  21. 31 0
      src/main/java/com/zswl/dataservice/service/user/OperationLogsService.java
  22. 19 0
      src/main/java/com/zswl/dataservice/type/OperationLogType.java
  23. 1 0
      src/main/java/com/zswl/dataservice/type/ResultState.java
  24. 9 1
      src/main/java/com/zswl/dataservice/utils/result/ResultContent.java

+ 23 - 0
src/main/java/com/zswl/dataservice/auth/FilterConfig.java

@@ -0,0 +1,23 @@
+package com.zswl.dataservice.auth;
+
+import jakarta.servlet.Filter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author TRX
+ * @date 2024/9/13
+ */
+@Configuration
+public class FilterConfig {
+    @Bean
+    public FilterRegistrationBean<Filter> myFilter() {
+        FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
+        registrationBean.setFilter(new RequestCachingFilter());
+        // 过滤路径
+        registrationBean.addUrlPatterns("/v1/openApi/*");
+        registrationBean.setOrder(1);
+        return registrationBean;
+    }
+}

+ 20 - 0
src/main/java/com/zswl/dataservice/auth/OpenAPIContext.java

@@ -0,0 +1,20 @@
+package com.zswl.dataservice.auth;
+
+import com.zswl.dataservice.model.user.LoginUser;
+
+public class OpenAPIContext {
+
+    public static ThreadLocal<String> context = new ThreadLocal<String>();
+
+    public static String get() {
+        return context.get();
+    }
+
+    public static void set(String param) {
+        context.set(param);
+    }
+
+    public static void clear() {
+        context.remove();
+    }
+}

+ 26 - 2
src/main/java/com/zswl/dataservice/auth/OpenAPIInterceptor.java

@@ -1,11 +1,15 @@
 package com.zswl.dataservice.auth;
 
-import com.alibaba.fastjson.JSON;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.zswl.dataservice.model.user.LoginUser;
 import com.zswl.dataservice.service.base.RedisService;
 import com.zswl.dataservice.service.openApi.OpenApiVerifyService;
+import com.zswl.dataservice.type.ResultState;
 import com.zswl.dataservice.utils.exception.UnauthorizedException;
+import com.zswl.dataservice.utils.net.IPUtil;
+import com.zswl.dataservice.utils.result.ResultContent;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -21,7 +25,7 @@ import java.util.Map;
 @Slf4j
 public class OpenAPIInterceptor implements HandlerInterceptor {
 
-    public static final String openApi = "openApi";
+    public static final String openApi = "/openApi/";
 
     private OpenApiVerifyService openApiVerifyService;
 
@@ -36,6 +40,26 @@ public class OpenAPIInterceptor implements HandlerInterceptor {
             return true;
         }
         String path = request.getRequestURI();
+        boolean isInBlackList = openApiVerifyService.isInBlackList(request);
+        if (isInBlackList) {
+            // 在黑名单当中
+            response.setCharacterEncoding("UTF-8");
+            response.setHeader("Content-Type", "application/json");
+            response.setStatus(HttpStatus.PAYMENT_REQUIRED.value());
+
+            JSONObject data = new JSONObject();
+            data.put("message", "拒绝请求");
+            data.put("code", 402);
+            data.put("state", "Fail");
+            data.put("success", false);
+            data.put("failed", true);
+
+            response.getWriter().write(data.toJSONString());
+            response.getWriter().flush();
+            response.getWriter().close();
+            return false;
+        }
+
         if (path != null && path.indexOf(openApi) > 0) {
             return openApiVerifyService.verify(request, response, object);
         }

+ 46 - 0
src/main/java/com/zswl/dataservice/auth/RequestCachingFilter.java

@@ -0,0 +1,46 @@
+package com.zswl.dataservice.auth;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.annotation.WebFilter;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+import org.springframework.web.util.ContentCachingRequestWrapper;
+
+import java.io.IOException;
+
+/**
+ * @author TRX
+ * @date 2024/9/13
+ */
+@Slf4j
+public class RequestCachingFilter extends OncePerRequestFilter {
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
+        ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(httpServletRequest);
+        try {
+            int contentLenth = wrappedRequest.getContentLength();
+            byte[] bytes = new byte[contentLenth];
+            ServletInputStream is = wrappedRequest.getInputStream();
+            for (int index = 0; index < contentLenth; index++) {
+                int value = is.read();
+                if (value == -1) {
+                    is.reset();
+                    break;
+                }
+                bytes[index] = (byte) value;
+            }
+            bytes = null;
+            is = null;
+        } catch (Exception e) {
+            log.error("RequestCachingFilter error: {}", e.getMessage());
+        }
+        filterChain.doFilter(wrappedRequest, httpServletResponse);
+    }
+}

+ 1 - 0
src/main/java/com/zswl/dataservice/auth/UserContextInterceptor.java

@@ -126,6 +126,7 @@ public class UserContextInterceptor implements HandlerInterceptor {
 
     @Override
     public void afterCompletion(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        UserContext.shutdown();
     }
 
     private LoginUser verifyUser(String token) throws UnauthorizedException {

+ 64 - 0
src/main/java/com/zswl/dataservice/controller/openApi/BlackListController.java

@@ -0,0 +1,64 @@
+package com.zswl.dataservice.controller.openApi;
+
+import com.zswl.dataservice.model.openApi.blackList.BlackListModel;
+import com.zswl.dataservice.model.openApi.blackList.BlackListParam;
+import com.zswl.dataservice.model.openApi.blackList.BlackListSearch;
+import com.zswl.dataservice.service.openApi.BlackListService;
+import com.zswl.dataservice.utils.result.ResultContent;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * BlackList
+ *
+ * @author TRX
+ * @date 2024/3/21
+ */
+@RequestMapping("blackList")
+@RestController
+@Validated
+@Tag(name = "访问黑名单管理")
+public class BlackListController {
+
+    @Autowired
+    BlackListService blackListService;
+
+    @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
+    @Operation(summary = "添加-编辑数据")
+    @RequestMapping(value = "saveInfo", method = {RequestMethod.POST})
+    public ResultContent saveInfo(@RequestBody BlackListParam param) {
+        return blackListService.saveInfo(param);
+    }
+
+    @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
+    @Operation(summary = "数据列表-分页查询")
+    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
+    public ResultContent<Page<BlackListModel>> page(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable, @Parameter(required = false) BlackListSearch param) {
+        return blackListService.page(pageable, param);
+    }
+
+    @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
+    @Operation(summary = "删除数据")
+    @RequestMapping(value = "deleteBlackList", method = {RequestMethod.GET})
+    public ResultContent deleteBlackList(@Parameter(name = "id", description = "数据id") String id) {
+        return blackListService.deleteBlackList(id);
+    }
+
+    @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
+    @Operation(summary = "查询详情")
+    @RequestMapping(value = "getDetail", method = {RequestMethod.GET})
+    public ResultContent<BlackListModel> getDetail(@Parameter(name = "id", description = "数据id") String id) {
+        return blackListService.getDetail(id);
+    }
+}

+ 13 - 2
src/main/java/com/zswl/dataservice/controller/openApi/SystemTimeController.java

@@ -8,13 +8,17 @@ import com.zswl.dataservice.service.openApi.SystemTimeService;
 import com.zswl.dataservice.utils.result.ResultContent;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpRequest;
 import org.springframework.http.MediaType;
 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 org.springframework.web.util.ContentCachingRequestWrapper;
 
 /**
  * 系统时间服务
@@ -33,8 +37,15 @@ public class SystemTimeController {
 
     @Operation(summary = "获取服务器时间接口")
     @PostMapping(value = "serverTime", consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent<SystemTimeModel> serverTime(@RequestBody SystemTimeParam param) {
-        return systemTimeService.serverTime(param);
+    public ResultContent<SystemTimeModel> serverTime(HttpServletRequest request) {
+        SystemTimeParam param = new SystemTimeParam();
+        if (request instanceof ContentCachingRequestWrapper) {
+            ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) request;
+            log.info("--------------{}", wrapper.getContentAsString());
+        }
+
+//        return systemTimeService.serverTime(param);
+        return ResultContent.buildFail("拒绝请求", 402);
     }
 
 }

+ 4 - 0
src/main/java/com/zswl/dataservice/dao/mqtt/impl/OperationLogsDaoImpl.java

@@ -54,6 +54,10 @@ public class OperationLogsDaoImpl extends BaseImpl implements OperationLogsDaoEx
             criteria.and("dataId").is(param.getDataId());
         }
 
+        if (param.getOperationLogType() != null) {
+            criteria.and("operationLogType").is(param.getOperationLogType());
+        }
+
         // 模糊搜索
         List<Criteria> criterias = new ArrayList<>();
         if (StringUtils.isNotEmpty(param.getContent())) {

+ 20 - 0
src/main/java/com/zswl/dataservice/dao/openApi/BlackListDao.java

@@ -0,0 +1,20 @@
+package com.zswl.dataservice.dao.openApi;
+
+import com.zswl.dataservice.dao.MongoDao;
+import com.zswl.dataservice.dao.openApi.extend.BlackListDaoExtend;
+import com.zswl.dataservice.dao.openApi.extend.OpenApiSignInfoDaoExtend;
+import com.zswl.dataservice.domain.openApi.BlackList;
+import com.zswl.dataservice.domain.openApi.OpenApiSignInfo;
+
+/**
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface BlackListDao extends MongoDao<BlackList>, BlackListDaoExtend {
+
+    BlackList findTopById(String id);
+
+    BlackList findTopByIp(String ip);
+
+    boolean existsByIp(String ip);
+}

+ 17 - 0
src/main/java/com/zswl/dataservice/dao/openApi/extend/BlackListDaoExtend.java

@@ -0,0 +1,17 @@
+package com.zswl.dataservice.dao.openApi.extend;
+
+import com.zswl.dataservice.domain.openApi.BlackList;
+import com.zswl.dataservice.domain.openApi.OpenApiSignInfo;
+import com.zswl.dataservice.model.openApi.blackList.BlackListSearch;
+import com.zswl.dataservice.model.openApi.sign.OpenApiSignInfoSearch;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/7/7
+ * @Version: 1.0
+ */
+public interface BlackListDaoExtend {
+    Page<BlackList> page(Pageable pageable, BlackListSearch param);
+}

+ 59 - 0
src/main/java/com/zswl/dataservice/dao/openApi/impl/BlackListDaoImpl.java

@@ -0,0 +1,59 @@
+package com.zswl.dataservice.dao.openApi.impl;
+
+import com.zswl.dataservice.dao.base.BaseImpl;
+import com.zswl.dataservice.dao.openApi.extend.BlackListDaoExtend;
+import com.zswl.dataservice.dao.openApi.extend.OpenApiSignInfoDaoExtend;
+import com.zswl.dataservice.domain.openApi.BlackList;
+import com.zswl.dataservice.domain.openApi.OpenApiSignInfo;
+import com.zswl.dataservice.helper.DBHelper;
+import com.zswl.dataservice.model.openApi.blackList.BlackListSearch;
+import com.zswl.dataservice.model.openApi.sign.OpenApiSignInfoSearch;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class BlackListDaoImpl extends BaseImpl implements BlackListDaoExtend {
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Override
+    public Page<BlackList> page(Pageable pageable, BlackListSearch param) {
+        Criteria criteria = new Criteria();
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.getIp())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getIp() + ".*$");
+            criterias.add(Criteria.where("ip").is(pattern));
+        }
+
+        if (StringUtils.isNotEmpty(param.getRemark())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getRemark() + ".*$");
+            criterias.add(Criteria.where("remark").is(pattern));
+        }
+        if (!CollectionUtils.isEmpty(criterias)) {
+            criteria.andOperator(criterias.toArray(new Criteria[]{}));
+        }
+        criteria.and("isDelete").is(Boolean.FALSE);
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, BlackList.class);
+    }
+
+}

+ 4 - 0
src/main/java/com/zswl/dataservice/domain/mqtt/OperationLogs.java

@@ -2,6 +2,7 @@ package com.zswl.dataservice.domain.mqtt;
 
 import com.zswl.dataservice.domain.base.SuperEntity;
 import com.zswl.dataservice.type.MessageType;
+import com.zswl.dataservice.type.OperationLogType;
 import com.zswl.dataservice.type.ResponseCode;
 import com.zswl.dataservice.utils.mqtt.type.LoginType;
 import com.zswl.dataservice.utils.mqtt.type.LogsLevel;
@@ -19,6 +20,9 @@ public class OperationLogs extends SuperEntity {
     @Schema(description = "用户ID")
     private String uid;
 
+    @Schema(description = "类型")
+    private OperationLogType operationLogType = OperationLogType.Common;
+
     @Schema(description = "登录名")
     private String loginName;
 

+ 25 - 0
src/main/java/com/zswl/dataservice/domain/openApi/BlackList.java

@@ -0,0 +1,25 @@
+package com.zswl.dataservice.domain.openApi;
+
+import com.zswl.dataservice.domain.base.SuperEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * 黑名单功能数据
+ *
+ * @author TRX
+ * @date 2024/9/13
+ */
+@Data
+@Document
+@NoArgsConstructor
+@AllArgsConstructor
+public class BlackList extends SuperEntity {
+
+    @Schema(description = "ip地址")
+    private String ip;
+
+}

+ 19 - 0
src/main/java/com/zswl/dataservice/model/openApi/blackList/BlackListModel.java

@@ -0,0 +1,19 @@
+package com.zswl.dataservice.model.openApi.blackList;
+
+import com.zswl.dataservice.model.baseParam.SuperModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/9/13
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BlackListModel extends SuperModel {
+    @Schema(description = "ip地址")
+    private String ip;
+}

+ 22 - 0
src/main/java/com/zswl/dataservice/model/openApi/blackList/BlackListParam.java

@@ -0,0 +1,22 @@
+package com.zswl.dataservice.model.openApi.blackList;
+
+import com.zswl.dataservice.model.baseParam.SuperParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/9/13
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BlackListParam extends SuperParam {
+
+    @NotEmpty(message = "ip地址不能为空")
+    @Schema(description = "ip地址")
+    private String ip;
+}

+ 22 - 0
src/main/java/com/zswl/dataservice/model/openApi/blackList/BlackListSearch.java

@@ -0,0 +1,22 @@
+package com.zswl.dataservice.model.openApi.blackList;
+
+import com.zswl.dataservice.model.baseParam.SuperSearchParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/9/13
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BlackListSearch extends SuperSearchParam {
+    @Schema(description = "ip地址")
+    private String ip;
+
+    @Schema(description = "备注")
+    private String remark;
+}

+ 13 - 0
src/main/java/com/zswl/dataservice/model/operLogs/OperationLogsModel.java

@@ -2,6 +2,7 @@ package com.zswl.dataservice.model.operLogs;
 
 import com.zswl.dataservice.model.baseParam.SuperModel;
 import com.zswl.dataservice.type.MessageType;
+import com.zswl.dataservice.type.OperationLogType;
 import com.zswl.dataservice.type.ResponseCode;
 import com.zswl.dataservice.utils.mqtt.type.LoginType;
 import com.zswl.dataservice.utils.mqtt.type.LogsLevel;
@@ -24,6 +25,18 @@ public class OperationLogsModel extends SuperModel {
     @Schema(description = "用户名称")
     private String userName;
 
+    @Schema(description = "类型")
+    private OperationLogType operationLogType;
+
+    private String operationLogTypeStr;
+
+    public String getOperationLogTypeStr() {
+        if (operationLogType != null) {
+            return operationLogType.getRemark();
+        }
+        return "";
+    }
+
     @Schema(description = "IP地址")
     private String ip;
 

+ 4 - 0
src/main/java/com/zswl/dataservice/model/operLogs/OperationLogsSearchParam.java

@@ -1,6 +1,7 @@
 package com.zswl.dataservice.model.operLogs;
 
 import com.zswl.dataservice.model.baseParam.SuperSearchParam;
+import com.zswl.dataservice.type.OperationLogType;
 import com.zswl.dataservice.utils.mqtt.type.LoginType;
 import com.zswl.dataservice.utils.mqtt.type.LogsLevel;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -21,6 +22,9 @@ public class OperationLogsSearchParam extends SuperSearchParam {
     @Schema(description = "用户名称")
     private String userName;
 
+    @Schema(description = "类型")
+    private OperationLogType operationLogType;
+
     @Schema(description = "IP地址")
     private String ip;
 

+ 116 - 0
src/main/java/com/zswl/dataservice/service/openApi/BlackListService.java

@@ -0,0 +1,116 @@
+package com.zswl.dataservice.service.openApi;
+
+import com.zswl.dataservice.dao.openApi.BlackListDao;
+import com.zswl.dataservice.dataConfig.ResultMessage;
+import com.zswl.dataservice.domain.openApi.BlackList;
+import com.zswl.dataservice.model.openApi.blackList.BlackListModel;
+import com.zswl.dataservice.model.openApi.blackList.BlackListParam;
+import com.zswl.dataservice.model.openApi.blackList.BlackListSearch;
+import com.zswl.dataservice.service.base.SuperService;
+import com.zswl.dataservice.service.user.OperationLogsService;
+import com.zswl.dataservice.utils.bean.BeanUtils;
+import com.zswl.dataservice.utils.mqtt.type.LogsLevel;
+import com.zswl.dataservice.utils.page.PageEntityUtil;
+import com.zswl.dataservice.utils.result.ResultContent;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+/**
+ * openAPI 认证信息维护
+ *
+ * @author TRX
+ * @date 2024/9/11
+ */
+@Slf4j
+@Service
+public class BlackListService extends SuperService {
+
+    @Autowired
+    OperationLogsService operationLogsService;
+
+    @Autowired
+    BlackListDao blackListDao;
+
+    /**
+     * 添加
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent saveInfo(BlackListParam param) {
+        BlackList nameTemp = blackListDao.findTopByIp(param.getIp());
+        BlackList entity = null;
+        if (StringUtils.isNotEmpty(param.getId())) {
+            entity = blackListDao.findTopById(param.getId());
+            if (ObjectUtils.isEmpty(entity)) {
+                return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
+            }
+            if (ObjectUtils.isNotEmpty(nameTemp) && !nameTemp.getId().equals(param.getId())) {
+                return ResultContent.buildFail(String.format("ip地址已存在:%s", param.getIp()));
+            }
+            BeanUtils.copyProperties(param, entity);
+        } else {
+            if (ObjectUtils.isNotEmpty(nameTemp)) {
+                return ResultContent.buildFail(String.format("ip地址已存在:%s", param.getIp()));
+            }
+            param.setId(null);
+            entity = new BlackList();
+            BeanUtils.copyProperties(param, entity);
+            initEntity(entity);
+            operationLogsService.addLogs(String.format("添加了黑名单数据:%s", param.getIp()), LogsLevel.High);
+        }
+        blackListDao.save(entity);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 列表
+     *
+     * @param pageable
+     * @param param
+     * @return
+     */
+    public ResultContent<Page<BlackListModel>> page(Pageable pageable, BlackListSearch param) {
+        Page<BlackList> page = blackListDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    /**
+     * 删除
+     *
+     * @param id
+     * @return
+     */
+    public ResultContent deleteBlackList(String id) {
+        BlackList entity = blackListDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format("数据ID不存在: %s", id));
+        }
+        blackListDao.delete(entity);
+        operationLogsService.addLogs(String.format("删除了黑名单数据:%s", entity.getIp()), LogsLevel.High, entity);
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent<BlackListModel> getDetail(String id) {
+        BlackList entity = blackListDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format("数据ID不存在: %s", id));
+        }
+        return ResultContent.buildSuccess(toModel(entity));
+    }
+
+    public BlackListModel toModel(BlackList entity) {
+        BlackListModel model = null;
+        if (ObjectUtils.isNotEmpty(entity)) {
+            model = new BlackListModel();
+            BeanUtils.copyProperties(entity, model);
+        }
+        return model;
+    }
+
+}

+ 54 - 18
src/main/java/com/zswl/dataservice/service/openApi/OpenApiVerifyService.java

@@ -1,17 +1,28 @@
 package com.zswl.dataservice.service.openApi;
 
-import cn.hutool.json.JSONObject;
+import com.zswl.dataservice.dao.openApi.BlackListDao;
 import com.zswl.dataservice.dao.openApi.OpenApiRequestLogDao;
 import com.zswl.dataservice.service.base.RedisService;
+import com.zswl.dataservice.service.user.OperationLogsService;
+import com.zswl.dataservice.type.OperationLogType;
+import com.zswl.dataservice.utils.mqtt.type.LogsLevel;
+import com.zswl.dataservice.utils.net.IPUtil;
+import com.zswl.dataservice.utils.os.SystemUtil;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.util.ContentCachingRequestWrapper;
 
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author TRX
@@ -30,33 +41,46 @@ public class OpenApiVerifyService {
     @Autowired
     private OpenApiRequestLogDao openApiRequestLogDao;
 
+    @Autowired
+    OperationLogsService operationLogsService;
+
+    @Autowired
+    BlackListDao blackListDao;
+
+    //线程池
+    ExecutorService executorService = Executors.newFixedThreadPool(SystemUtil.getCpuCoreCount() * 2);
+
+    @Autowired
+    private void init(ApplicationContext applicationContext) {
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            executorService.shutdownNow();
+        }));
+    }
+
     /**
-     * 验证OpenAPI
+     * 验证OpenAPI  preHandle
      *
      * @param request
      * @param response
      * @param object
      * @return
      */
+    @SneakyThrows
     public boolean verify(HttpServletRequest request, HttpServletResponse response, Object object) {
         log.info("---------------------openAPI验证----------------------");
-        Map<String, String[]> map = request.getParameterMap();
-        log.info("map: {}", map);
-        log.info("tt: {}", request.getParameter("msgId"));
-
-        Map<String, String> paramMap = new LinkedHashMap<>();
-        map.forEach((String key, String[] values) -> {
-            log.info("key: {}, values: {}", key, values);
-            paramMap.put(key, values[0]);
-        });
-        JSONObject jsonObject = new JSONObject(paramMap);
-
-        log.info("jsonObject: {}", jsonObject);
+        String method = request.getMethod();
+        String sessionId = request.getRequestedSessionId();
+        log.info("sessionId: {}", sessionId);
+        String remoteIp = IPUtil.getRemoteIp(request);
+        if (request instanceof ContentCachingRequestWrapper) {
+            ContentCachingRequestWrapper contentCachingRequestWrapper = (ContentCachingRequestWrapper) request;
+            log.info("body {}", contentCachingRequestWrapper.getContentAsString());
+        }
         return true;
     }
 
     /**
-     * 记录日志
+     * 记录日志 postHandle
      *
      * @param request
      * @param response
@@ -64,7 +88,19 @@ public class OpenApiVerifyService {
      * @param modelAndView
      */
     public void saveLog(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
-
+        log.info("saveLog");
     }
 
+    public boolean isInBlackList(HttpServletRequest request) {
+        String ip = IPUtil.getRemoteIp(request);
+        if (blackListDao.existsByIp(ip)) {
+            ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            RequestContextHolder.setRequestAttributes(servletRequestAttributes, true);//设置子线程共享
+            executorService.execute(() -> {
+                operationLogsService.addLogs(String.format("黑名单地址访问: %s", ip), LogsLevel.High, OperationLogType.Black, null);
+            });
+            return true;
+        }
+        return false;
+    }
 }

+ 31 - 0
src/main/java/com/zswl/dataservice/service/user/OperationLogsService.java

@@ -8,6 +8,7 @@ import com.zswl.dataservice.domain.mqtt.OperationLogs;
 import com.zswl.dataservice.model.operLogs.OperationLogsModel;
 import com.zswl.dataservice.model.operLogs.OperationLogsSearchParam;
 import com.zswl.dataservice.service.base.SuperService;
+import com.zswl.dataservice.type.OperationLogType;
 import com.zswl.dataservice.utils.DateUtils;
 import com.zswl.dataservice.utils.bean.BeanUtils;
 import com.zswl.dataservice.utils.mqtt.type.LogsLevel;
@@ -93,6 +94,36 @@ public class OperationLogsService extends SuperService {
         return ResultContent.buildSuccess();
     }
 
+    public ResultContent addLogs(String content, LogsLevel level, OperationLogType operationLogType, SuperEntity entity) {
+        OperationLogs logs = new OperationLogs();
+        logs.setContent(content);
+        logs.setOperationLogType(operationLogType);
+        if (level == null) {
+            level = LogsLevel.Low;
+        }
+        logs.setLevel(level);
+        User user = getCrrentUser();
+        if (ObjectUtils.isNotEmpty(user)) {
+            logs.setUid(user.getId());
+            logs.setUserName(user.getUserName());
+            logs.setLoginName(user.getLoginName());
+        }
+        logs.setTime(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.FORMAT_LONG));
+        if (ObjectUtils.isNotEmpty(entity)) {
+            logs.setDataId(entity.getId());
+            logs.setBackObj(entity);
+        }
+        try {
+            logs.setUa(request.getHeader("User-Agent"));
+            logs.setIp(IPUtil.getRemoteIp(request));
+            logs.setUrl(request.getRequestURI());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        operationLogsDao.save(logs);
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 日志列表
      *

+ 19 - 0
src/main/java/com/zswl/dataservice/type/OperationLogType.java

@@ -0,0 +1,19 @@
+package com.zswl.dataservice.type;
+
+import lombok.Getter;
+
+/**
+ * 操作日志类型
+ */
+public enum OperationLogType {
+    Common("普通"),
+    Black("黑名单访问"),
+    ;
+
+    @Getter
+    private String remark;
+
+    OperationLogType(String remark) {
+        this.remark = remark;
+    }
+}

+ 1 - 0
src/main/java/com/zswl/dataservice/type/ResultState.java

@@ -11,6 +11,7 @@ public enum ResultState {
     Fail("失败"),
     Error("错误"),
     Exception("异常"),
+    PAYMENT_REQUIRED("拒绝请求"),
 
     UserExists("用户存在"),
     UserNotExists("用户不存在"),

+ 9 - 1
src/main/java/com/zswl/dataservice/utils/result/ResultContent.java

@@ -34,6 +34,10 @@ public class ResultContent<T> {
     @Setter
     private String msg;
 
+    @Getter
+    @Setter
+    private Integer code = 200;
+
 
     /**
      * 获取内容
@@ -61,7 +65,11 @@ public class ResultContent<T> {
     }
 
     public static <T> ResultContent buildFail(String msg) {
-        return ResultContent.builder().state(ResultState.Fail).msg(msg).build();
+        return ResultContent.builder().state(ResultState.Fail).code(500).msg(msg).build();
+    }
+
+    public static <T> ResultContent buildFail(String msg, Integer code) {
+        return ResultContent.builder().state(ResultState.Fail).code(code).msg(msg).build();
     }
 
     public static <T> ResultContent buildSuccess(String msg) {