zy-acs-framework/src/main/java/com/zy/acs/framework/annotations/IntegrationAuth.java
File was deleted zy-acs-manager/src/main/java/com/zy/acs/manager/common/annotation/IntegrationAuth.java
New file @@ -0,0 +1,23 @@ package com.zy.acs.manager.common.annotation; import com.zy.acs.manager.core.domain.type.NamespaceType; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface IntegrationAuth { Enable value() default Enable.LOG; NamespaceType name() default NamespaceType.NONE; public enum Enable{ LOG, SKIP_LOG } } zy-acs-manager/src/main/java/com/zy/acs/manager/common/config/IntegrationRecordAdvice.java
@@ -1,9 +1,7 @@ package com.zy.acs.manager.common.config; import com.alibaba.fastjson.JSON; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.common.R; import com.zy.acs.manager.common.utils.IpTools; import com.zy.acs.manager.manager.service.IntegrationRecordService; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -23,7 +21,7 @@ import java.nio.charset.StandardCharsets; @Slf4j //@ControllerAdvice @ControllerAdvice public class IntegrationRecordAdvice implements ResponseBodyAdvice<Object> { @Autowired zy-acs-manager/src/main/java/com/zy/acs/manager/common/config/WebMvcConfig.java
@@ -1,6 +1,7 @@ package com.zy.acs.manager.common.config; import com.zy.acs.manager.common.constant.Constants; import com.zy.acs.manager.common.interceptor.IntegrationOpenApiInterceptor; import com.zy.acs.manager.common.utils.Http; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -9,6 +10,7 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -21,8 +23,13 @@ @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Resource private IntegrationOpenApiInterceptor integrationOpenApiInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(integrationOpenApiInterceptor) .addPathPatterns("/api/open/**"); registry.addInterceptor(getAsyncHandlerInterceptor()) .addPathPatterns("/**") ; zy-acs-manager/src/main/java/com/zy/acs/manager/common/domain/TaskDto.java
@@ -18,6 +18,6 @@ private String destSta; private Integer priority = 1; private Integer priority; } zy-acs-manager/src/main/java/com/zy/acs/manager/common/interceptor/IntegrationOpenApiInterceptor.java
New file @@ -0,0 +1,125 @@ package com.zy.acs.manager.common.interceptor; import com.zy.acs.framework.common.Cools; import com.zy.acs.manager.common.annotation.IntegrationAuth; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.util.ContentCachingRequestWrapper; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * Intercepts open API calls so they can be audited via IntegrationRecordAdvice. */ @Slf4j @Component public class IntegrationOpenApiInterceptor implements HandlerInterceptor { private static final String ATTR_APP_AUTH = "appAuth"; private static final String ATTR_AUTH_MEMO = "integrationAuthMemo"; private static final String ATTR_CACHE = "cache"; private static final String ATTR_START_AT = "openApiStartTime"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; IntegrationAuth integrationAuth = findIntegrationAuth(handlerMethod); if (integrationAuth == null) { log.debug("Skip open-api logging for {} because @IntegrationAuth is missing", handlerMethod.getMethod()); return true; } request.setAttribute(ATTR_APP_AUTH, integrationAuth.value()); if (!Cools.isEmpty(integrationAuth.memo())) { request.setAttribute(ATTR_AUTH_MEMO, integrationAuth.memo()); } request.setAttribute(ATTR_START_AT, System.currentTimeMillis()); request.setAttribute(ATTR_CACHE, buildRequestCache(request)); return true; } private IntegrationAuth findIntegrationAuth(HandlerMethod handlerMethod) { IntegrationAuth annotation = AnnotatedElementUtils.findMergedAnnotation(handlerMethod.getMethod(), IntegrationAuth.class); if (annotation != null) { return annotation; } return AnnotatedElementUtils.findMergedAnnotation(handlerMethod.getBeanType(), IntegrationAuth.class); } private Map<String, Object> buildRequestCache(HttpServletRequest request) { Map<String, Object> cache = new LinkedHashMap<>(); cache.put("method", request.getMethod()); cache.put("uri", request.getRequestURI()); cache.put("query", request.getQueryString()); cache.put("parameters", flattenParameters(request.getParameterMap())); cache.put("headers", extractHeaders(request)); String body = readBody(request); if (!Cools.isEmpty(body)) { cache.put("body", body); } return cache; } private Map<String, Object> flattenParameters(Map<String, String[]> rawParams) { Map<String, Object> flattened = new LinkedHashMap<>(); if (rawParams == null) { return flattened; } rawParams.forEach((key, values) -> { if (values == null) { flattened.put(key, null); } else if (values.length == 1) { flattened.put(key, values[0]); } else { flattened.put(key, Arrays.asList(values)); } }); return flattened; } private Map<String, Object> extractHeaders(HttpServletRequest request) { Map<String, Object> headers = new LinkedHashMap<>(); List<String> names = Collections.list(request.getHeaderNames()); for (String name : names) { headers.put(name, request.getHeader(name)); } return headers; } private String readBody(HttpServletRequest request) { if (request instanceof ContentCachingRequestWrapper) { ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) request; byte[] buffer = wrapper.getContentAsByteArray(); if (buffer.length > 0) { Charset charset = charset(wrapper.getCharacterEncoding()); return new String(buffer, charset); } } return null; } private Charset charset(String encoding) { if (Cools.isEmpty(encoding)) { return StandardCharsets.UTF_8; } try { return Charset.forName(encoding); } catch (Exception e) { return StandardCharsets.UTF_8; } } } zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/NamespaceType.java
@@ -2,6 +2,7 @@ public enum NamespaceType { NONE("未知"), RCS_TASK_REPORT("任务完成上报"), ; zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java
@@ -2,9 +2,11 @@ import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.common.R; import com.zy.acs.manager.common.annotation.IntegrationAuth; import com.zy.acs.manager.common.annotation.OperationLog; import com.zy.acs.manager.common.constant.Constants; import com.zy.acs.manager.common.domain.TaskBoolDto; import com.zy.acs.manager.core.domain.type.NamespaceType; import com.zy.acs.manager.core.integrate.dto.OpenBusCancelParam; import com.zy.acs.manager.core.integrate.dto.OpenBusCancelResult; import com.zy.acs.manager.core.integrate.dto.OpenBusSubmitParam; @@ -43,6 +45,7 @@ @PostMapping("/bus/submit") @OperationLog("generate task from open api") @IntegrationAuth(name = NamespaceType.RCS_TASK_REPORT) public R submit(@RequestBody OpenBusSubmitParam param, HttpServletRequest request) { IntegrationRecord integrationRecord = new IntegrationRecord( null, // 编号 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ValidService.java
@@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; /** * Created by vincent on 2023/6/14 @@ -48,6 +49,7 @@ if (Cools.isEmpty(taskDto.getTaskNo())) { throw new BusinessException("Task seqNum can't be empty!"); } taskDto.setPriority(Optional.ofNullable(taskDto.getPriority()).orElse(1)); Task task = new Task(); taskList.add(task); task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));