diff --git a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/aes/SM4Utils.java b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/aes/SM4Utils.java index 4780323..11c1562 100644 --- a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/aes/SM4Utils.java +++ b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/aes/SM4Utils.java @@ -93,7 +93,7 @@ public class SM4Utils { } public static void main(String[] args) { - System.err.println( decryptData_CBC("VlWYLrghArikg+SQKS4obg==")); + System.err.println( decryptData_CBC("hz6mXadxdNrq2iE8vG9X+rcDwInsjg1EA7PMY1/mOsw=")); } private static String decryptData(String type, String cipherText, String secretKey, String iv) { try { diff --git a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/globals/SystemGlobal.java b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/globals/SystemGlobal.java new file mode 100644 index 0000000..5f12c88 --- /dev/null +++ b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/globals/SystemGlobal.java @@ -0,0 +1,65 @@ +package com.securitycontrol.common.core.utils.globals; + +/** + * @author 黑子 + * 全局变量 + */ +public class SystemGlobal { + /** + * true + */ + public static String undefined="undefined"; + + /** + * true + */ + public static String TRUE_STR="true"; + /** + * formData + */ + public static String FORM_DATA="formData"; + + /** + * + * 解密头 + */ + public final static String KEY_DECRYPT="decrypt"; + /** + * 加密头 + */ + public final static String KEY_ENCRYPT ="encryption"; + /** + * 成功的200 字符串 + */ + public final static String SUCCESS_CODE_STR="200"; + + /** + * POST 请求 + */ + public final static String POST="POST"; + /** + * PUT 请求 + */ + public final static String PUT="PUT"; + + /** + * 文件存储类型-local + */ + public final static String LOCAL="local"; + /** + * 文件存储类型-oss + */ + public final static String OSS="oss"; + + /** + * 文件存储类型-mongodb + */ + public final static String MONGODB="mongodb"; + + /** + * 文件存储类型-obs + */ + public final static String OBS="obs"; + + public final static int SUCCESS_MIN_NUM = 0; +} diff --git a/securitycontrol-gateway/src/main/java/com/securitycontrol/gateway/filter/ResponseEncryptFilter.java b/securitycontrol-gateway/src/main/java/com/securitycontrol/gateway/filter/ResponseEncryptFilter.java new file mode 100644 index 0000000..d902a56 --- /dev/null +++ b/securitycontrol-gateway/src/main/java/com/securitycontrol/gateway/filter/ResponseEncryptFilter.java @@ -0,0 +1,163 @@ +package com.securitycontrol.gateway.filter; + +import com.alibaba.fastjson.JSON; +import com.alibaba.nacos.shaded.com.google.common.collect.Maps; +import com.securitycontrol.common.core.utils.aes.SM4Utils; +import com.securitycontrol.common.core.utils.globals.SystemGlobal; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Charsets; +import org.reactivestreams.Publisher; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.core.io.buffer.DefaultDataBufferFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.http.server.reactive.ServerHttpResponseDecorator; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; + +/** + * 对返回的 data数据进行加密 + * @author 黑子 + */ +@Configuration +@Slf4j +public class ResponseEncryptFilter implements GlobalFilter, Ordered { + + @Value("${system.res}") + public boolean jaData; + /** + * 返回的数据 是否加密 + */ + public final static String KEY_HEAD="decrypt"; + + /**忽略加密的参数的请求*/ + public static List ignoreUrls = new ArrayList<>(); + + { + ignoreUrls.add("/tcp/ball/xmlAnalysis"); + } + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + log.info("============================ResponseEncryptFilter start==================================="); + + ServerHttpRequest request = exchange.getRequest(); + URI uri = request.getURI(); + String reqPath = request.getURI().getPath(); + boolean sf = ignoreUrls.contains(reqPath); + if(sf){ + return chain.filter(exchange); + } + HttpHeaders headers=request.getHeaders(); + if(headers!=null){ + Object object=headers.getFirst("Content-Type"); + Object head=headers.getFirst(SystemGlobal.KEY_ENCRYPT); + if (head!=null){ + String keyHead=head.toString(); + if (SystemGlobal.KEY_ENCRYPT.equals(keyHead)){ + return chain.filter(exchange); + } + } + if(object!=null){ + String contentType=object.toString(); + if (contentType.contains(MULTIPART_FORM_DATA_VALUE)){ + return chain.filter(exchange); + } + } + } + HttpStatus statusCode = exchange.getResponse().getStatusCode(); + if(Objects.equals(statusCode, HttpStatus.BAD_REQUEST) || Objects.equals(statusCode, HttpStatus.TOO_MANY_REQUESTS)){ + // 如果是特殊的请求,已处理响应内容,这里不再处理 + return chain.filter(exchange); + } + //是否加密 + if(!jaData){ + return chain.filter(exchange); + } + // 根据具体业务内容,修改响应体 + return modifyResponseBody(exchange, chain); + } + + /** + * 修改响应体 + * @param exchange + * @param chain + * @return + */ + private Mono modifyResponseBody(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpResponse originalResponse = exchange.getResponse(); + originalResponse.getHeaders().setContentType(MediaType.APPLICATION_JSON); + DataBufferFactory bufferFactory = originalResponse.bufferFactory(); + ServerHttpResponseDecorator response = buildResponse(originalResponse, bufferFactory); + return chain.filter(exchange.mutate().response(response).build()); + } + + + @Override + public int getOrder() { + return -5; + } + private ServerHttpResponseDecorator buildResponse(ServerHttpResponse originalResponse, DataBufferFactory bufferFactory) { + return new ServerHttpResponseDecorator(originalResponse) { + @Override + public Mono writeWith(Publisher body) { + if (getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) { + Flux fluxBody = Flux.from(body); + return super.writeWith(fluxBody.buffer().map(dataBuffers -> { + DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); + DataBuffer join = dataBufferFactory.join(dataBuffers); + byte[] content = new byte[join.readableByteCount()]; + join.read(content); + DataBufferUtils.release(join); + // 流转为字符串 + String responseData = new String(content, Charsets.UTF_8); + System.out.println(responseData); + Map map = JSON.parseObject(responseData); + Map maps= Maps.newHashMap(); + //加密则数据 进行加密 + if(jaData){ + responseData = SM4Utils.encryptData_CBC(responseData.trim()); + maps.put("data",responseData); + maps.put(SystemGlobal.KEY_DECRYPT,true); + responseData=JSON.toJSONString(maps); + }else{ + maps.put("data",responseData); + maps.put(SystemGlobal.KEY_DECRYPT,false); + } + byte[] uppedContent = responseData.getBytes(Charsets.UTF_8); + originalResponse.getHeaders().setContentLength(uppedContent.length); + return bufferFactory.wrap(uppedContent); + })); + } else { + log.error("获取响应体数据 :"+getStatusCode()); + } + return super.writeWith(body); + } + + @Override + public Mono writeAndFlushWith(Publisher> body) { + return writeWith(Flux.from(body).flatMapSequential(p -> p)); + } + }; + } +} + diff --git a/securitycontrol-gateway/src/main/resources/bootstrap.yml b/securitycontrol-gateway/src/main/resources/bootstrap.yml index e7e9db5..0aa9475 100644 --- a/securitycontrol-gateway/src/main/resources/bootstrap.yml +++ b/securitycontrol-gateway/src/main/resources/bootstrap.yml @@ -49,6 +49,7 @@ endpoints: enable: false system: jm: true + res: true #加密组件 jasypt: encryptor: diff --git a/securitycontrol-model/securitycontrol-background/src/main/java/com/securitycontrol/background/service/impl/TodayTaskServiceImpl.java b/securitycontrol-model/securitycontrol-background/src/main/java/com/securitycontrol/background/service/impl/TodayTaskServiceImpl.java index 3fca837..b19bb37 100644 --- a/securitycontrol-model/securitycontrol-background/src/main/java/com/securitycontrol/background/service/impl/TodayTaskServiceImpl.java +++ b/securitycontrol-model/securitycontrol-background/src/main/java/com/securitycontrol/background/service/impl/TodayTaskServiceImpl.java @@ -43,6 +43,10 @@ public class TodayTaskServiceImpl implements ITodayTaskService { List list = new ArrayList<>(); List futureList = new ArrayList<>(); List newList = new ArrayList<>(); + if(StringHelper.isNotEmpty(dto.getWorkDay())){ + dto.setStartTime(dto.getWorkDay().split(" - ")[0]); + dto.setEndTime(dto.getWorkDay().split(" - ")[0]); + } try { dto = handleParams(dto); list = mapper.getToDayTaskLists(dto);