From 8d9238d74e86d86d54f8f955386705cb48337720 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Wed, 16 Aug 2023 15:59:20 +0800 Subject: [PATCH 01/12] =?UTF-8?q?test=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nanopart-server/src/main/resources/bootstrap.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nanopart-server/src/main/resources/bootstrap.yml b/nanopart-server/src/main/resources/bootstrap.yml index d084c1f5..71de70cb 100644 --- a/nanopart-server/src/main/resources/bootstrap.yml +++ b/nanopart-server/src/main/resources/bootstrap.yml @@ -4,12 +4,12 @@ spring: cloud: nacos: config: - server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} + server-addr: ${NACOS_HOST:test-nacos.axzo.cn}:${NACOS_PORT:80} file-extension: yaml - namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7} + namespace: ${NACOS_NAMESPACE_ID:f3c0f0d2-bac4-4498-bee7-9c3636b3afdf} prefix: ${spring.application.name} profiles: - active: ${NACOS_PROFILES_ACTIVE:dev} + active: ${NACOS_PROFILES_ACTIVE:test} include: swagger main: allow-bean-definition-overriding: true From e3d91bcadb44050836e60396b8300d00487df54d Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Wed, 16 Aug 2023 16:03:38 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E5=90=84=E7=8E=AF=E5=A2=83vm=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 232da083..1535bf8e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,19 @@ # 项目介绍 -一个通用的聚合服务:通用黑名单服务 \ No newline at end of file +一个通用的聚合服务:通用黑名单服务 + +# vm参数 +## dev环境 +-Dspring.datasource.url=jdbc:mysql://116.63.13.181:3311/pudge-dev?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=true&verifyServerCertificate=false&rewriteBatchedStatements=true +-Dspring.redis.host=123.249.44.111 +-Dspring.redis.port=31270 +-Dspring.redis.password=Kjgnj93JKj3je +-DCUSTOM_ENV=dev +-Dserver.port=8080 + +## test环境 +-Dspring.datasource.url=jdbc:mysql://124.70.43.174:3306/pudge?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=true&verifyServerCertificate=false&rewriteBatchedStatements=true +-Dspring.redis.host=123.249.44.111 +-Dspring.redis.port=31276 +-Dspring.redis.password=Kjgnj93JKj3je +-DCUSTOM_ENV=test +-Dserver.port=8080 \ No newline at end of file From dfb191f7362188c10281e26e9c8f22de108043b1 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Tue, 2 Jan 2024 17:12:53 +0800 Subject: [PATCH 03/12] =?UTF-8?q?feat(REQ-2040):=20=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- black-list/black-list-api/pom.xml | 4 + .../axzo/nanopart/api/SignatureUtilApi.java | 28 ++++ .../nanopart/api/annotation/CheckSign.java | 29 ++++ .../nanopart/api/aspect/CheckSignAspect.java | 145 ++++++++++++++++++ .../nanopart/api/config/SignConfigProps.java | 47 ++++++ .../axzo/nanopart/api/config/SignManager.java | 75 +++++++++ .../controller/SignatureUtilController.java | 31 ++++ 7 files changed, 359 insertions(+) create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/annotation/CheckSign.java create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignConfigProps.java create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignManager.java create mode 100644 black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java diff --git a/black-list/black-list-api/pom.xml b/black-list/black-list-api/pom.xml index 5b75d317..ffd67112 100644 --- a/black-list/black-list-api/pom.xml +++ b/black-list/black-list-api/pom.xml @@ -22,5 +22,9 @@ cn.axzo.framework axzo-common-domain + + jakarta.servlet + jakarta.servlet-api + diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java new file mode 100644 index 00000000..abc38f65 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java @@ -0,0 +1,28 @@ +package cn.axzo.nanopart.api; + +import cn.axzo.framework.domain.web.result.ApiResult; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.security.KeyPair; + +/** + * 签名工具类 + * + * @author chenwenjian + * @version 1.0 + * @date 2024/1/2 16:53 + */ +@FeignClient(name = "nanopart", url = "http://nanopart:8080") +public interface SignatureUtilApi { + + /** + * 生成公私钥对 + * + * @param algorithm 算法,例如:SHA256withRSA + * @return 公私钥对 + */ + @GetMapping("/api/signature/generateKeyPair") + ApiResult generateKeyPair(@RequestParam(value = "algorithm") String algorithm); +} diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/annotation/CheckSign.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/annotation/CheckSign.java new file mode 100644 index 00000000..aeabc395 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/annotation/CheckSign.java @@ -0,0 +1,29 @@ +package cn.axzo.nanopart.api.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 签名验证注解 + * + * @author chenwenjian + * @version 1.0 + * @date 2024/1/2 10:37 + */ +@Documented +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface CheckSign { + /** + * 签名字段,默认为sign + */ + String signField() default "sign"; + + /** + * header中需要参与签名的字段,若为空,则除签名字段外全部参与签名 + */ + String[] requireSignFields() default {}; +} diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java new file mode 100644 index 00000000..3e9a01c9 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java @@ -0,0 +1,145 @@ +package cn.axzo.nanopart.api.aspect; + +import cn.axzo.framework.domain.web.BizException; +import cn.axzo.framework.domain.web.code.RespCode; +import cn.axzo.nanopart.api.annotation.CheckSign; +import cn.axzo.nanopart.api.config.SignManager; +import cn.hutool.core.util.ArrayUtil; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import java.util.Collections; +import java.util.Enumeration; +import java.util.Objects; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2024/1/2 10:05 + */ +@Slf4j +@Aspect +@Order(1) +@Component +public class CheckSignAspect { + + @Resource + private SignManager signManager; + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.RequestMapping)") + public void requestMapping() { + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PostMapping)") + public void postMapping() { + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.GetMapping)") + public void getMapping() { + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PutMapping)") + public void putMapping() { + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.DeleteMapping)") + public void deleteMapping() { + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PatchMapping)") + public void patchMapping() { + } + + @Pointcut("requestMapping() || postMapping() || getMapping() || putMapping() || deleteMapping()|| patchMapping()") + public void mappingAnnotations() { + } + + /** + * 切入含有@CheckSign && @RestController 注解的类 + */ + @Before(value = "@within(checkSign) && @within(restController)") + public void classHandler(JoinPoint joinPoint, CheckSign checkSign, RestController restController) { + handle(joinPoint, checkSign); + } + + /** + * 切入含有@checkSign && @RequestMapping/@PostMapping/@GetMapping/@PutMapping/@DeleteMapping/@PatchMapping 之一注解的方法 + */ + @Before(value = "@annotation(checkSign) && mappingAnnotations()") + public void methodHandler(JoinPoint joinPoint, CheckSign checkSign) { + handle(joinPoint, checkSign); + } + + @SneakyThrows + public void handle(JoinPoint joinPoint, CheckSign checkSign) { + // 验签 + verifySignature(checkSign); + } + + private void verifySignature(CheckSign checkSign) { + HttpServletRequest httpRequest = ((ServletRequestAttributes) Objects + .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + + // 获取调用方 + String appKey = httpRequest.getHeader("appKey"); + if (StringUtils.isEmpty(appKey)) { + throw new BizException(new RespCode("403", "验签失败")); + } + + // 从请求头中提取签名 + String sign = httpRequest.getHeader(checkSign.signField()); + if (StringUtils.isEmpty(sign)) { + throw new BizException(new RespCode("403", "验签失败")); + } + + // 从Header中获取需要验签的参数字段 + StringBuilder data = new StringBuilder(); + if (ArrayUtil.isEmpty(checkSign.requireSignFields())) { + Enumeration headerNames = httpRequest.getHeaderNames(); + if (CollectionUtils.isEmpty(Collections.list(headerNames))) { + throw new BizException(new RespCode("403", "验签失败")); + } + while (headerNames.hasMoreElements()) { + String headerName = headerNames.nextElement(); + String value = httpRequest.getHeader(headerName); + if (StringUtils.isBlank(value)) { + throw new BizException(new RespCode("403", "验签失败")); + } + data.append(headerName).append("=").append(value).append("&"); + } + } else { + for (String field : checkSign.requireSignFields()) { + String value = httpRequest.getHeader(field); + if (StringUtils.isBlank(value)) { + throw new BizException(new RespCode("403", "验签失败")); + } + data.append(field).append("=").append(value).append("&"); + } + } + log.info("data:{}", data); + + try { + boolean verify = signManager.verify(appKey, data.toString(), sign); + if (!verify) { + throw new BizException(new RespCode("403", "验签失败")); + } + } catch (Exception e) { + throw new BizException(new RespCode("403", "验签失败")); + } + + } +} diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignConfigProps.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignConfigProps.java new file mode 100644 index 00000000..9b5b09f9 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignConfigProps.java @@ -0,0 +1,47 @@ +package cn.axzo.nanopart.api.config; + +import cn.hutool.crypto.asymmetric.SignAlgorithm; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 签名配置 + * + * @author chenwenjian + * @version 1.0 + * @date 2024/1/2 14:33 + */ +@Data +@Component +@ConfigurationProperties(prefix = "api.sign") +public class SignConfigProps { + + /** + * 是否启用签名 + */ + private Boolean enable = true; + + private Map keyPairs; + + @Data + public static class KeyPair { + /** + * 签名算法 + */ + private SignAlgorithm algorithm; + + /** + * 私钥 + */ + private String privateKey; + + + /** + * 公钥 + */ + private String publicKey; + } +} diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignManager.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignManager.java new file mode 100644 index 00000000..d329bad2 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignManager.java @@ -0,0 +1,75 @@ +package cn.axzo.nanopart.api.config; + +import cn.hutool.core.util.HexUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.asymmetric.Sign; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +/** + * 签名管理器 + * + * @author chenwenjian + * @version 1.0 + * @date 2024/1/2 15:41 + */ +@Component +@RequiredArgsConstructor +public class SignManager { + + private final SignConfigProps signConfigProps; + + /** + * 生成签名 + * 生成的签名为十六进制字符串 + * + * @param appKey 调用方 + * @param rawData 待签名数据 + * @return 签名 + */ + public String sign(String appKey, String rawData) { + Sign sign = getSignByAppKey(appKey); + if (Objects.isNull(sign)) { + return null; + } + return sign.signHex(rawData.getBytes(StandardCharsets.UTF_8)); + } + + /** + * 验证签名 + * + * @param appKey 调用方 + * @param rawData 待验证数据 + * @param rawSign 签名 + * @return true:验证成功 false:验证失败 + */ + public boolean verify(String appKey, String rawData, String rawSign) { + Sign sign = getSignByAppKey(appKey); + if (Objects.isNull(sign)) { + return false; + } + return sign.verify(rawData.getBytes(StandardCharsets.UTF_8), HexUtil.decodeHex(rawSign)); + } + + /** + * 获取签名 + * + * @param appKey 调用方 + * @return 签名算法对象 {@link Sign} + */ + public Sign getSignByAppKey(String appKey) { + if (CollectionUtils.isEmpty(signConfigProps.getKeyPairs())) { + return null; + } + SignConfigProps.KeyPair keyPair = signConfigProps.getKeyPairs().get(appKey); + if (Objects.isNull(keyPair)) { + return null; + } + return SecureUtil.sign(keyPair.getAlgorithm(), keyPair.getPrivateKey(), keyPair.getPublicKey()); + } + +} diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java new file mode 100644 index 00000000..cc007575 --- /dev/null +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java @@ -0,0 +1,31 @@ +package cn.axzo.nanopart.server.controller; + +import cn.axzo.framework.domain.ServiceException; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.SignatureUtilApi; +import cn.hutool.crypto.SecureUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; + +import java.security.KeyPair; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2024/1/2 16:59 + */ +@Slf4j +@RestController +public class SignatureUtilController implements SignatureUtilApi { + @Override + public ApiResult generateKeyPair(String algorithm) { + log.info("algorithm = {}", algorithm); + KeyPair keyPair = null; + try { + keyPair = SecureUtil.generateKeyPair(algorithm); + } catch (Exception e) { + throw new ServiceException("密钥对生成失败"); + } + return ApiResult.ok(keyPair); + } +} From 1a628786869c77653e2edf3c4871c24342f67f9c Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Tue, 2 Jan 2024 17:18:04 +0800 Subject: [PATCH 04/12] =?UTF-8?q?feat(REQ-2040):=20dev=E7=8E=AF=E5=A2=83na?= =?UTF-8?q?cos=E9=85=8D=E7=BD=AE=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nanopart-server/src/main/resources/bootstrap.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nanopart-server/src/main/resources/bootstrap.yml b/nanopart-server/src/main/resources/bootstrap.yml index d084c1f5..cbaf52b2 100644 --- a/nanopart-server/src/main/resources/bootstrap.yml +++ b/nanopart-server/src/main/resources/bootstrap.yml @@ -4,7 +4,7 @@ spring: cloud: nacos: config: - server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} + server-addr: ${NACOS_HOST:https://dev-nacos.axzo.cn}:${NACOS_PORT:443} file-extension: yaml namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7} prefix: ${spring.application.name} From 4506422fc9c7181f5a2aadf568fc486069956f63 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Tue, 2 Jan 2024 18:06:30 +0800 Subject: [PATCH 05/12] =?UTF-8?q?feat(REQ-2040):=20=E5=AF=86=E9=92=A5?= =?UTF-8?q?=E5=AF=B9=E7=94=9F=E6=88=90=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/nanopart/api/SignatureUtilApi.java | 5 +++-- .../server/controller/SignatureUtilController.java | 13 ++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java index abc38f65..543a1763 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import java.security.KeyPair; +import java.util.Map; /** * 签名工具类 @@ -20,9 +21,9 @@ public interface SignatureUtilApi { /** * 生成公私钥对 * - * @param algorithm 算法,例如:SHA256withRSA + * @param algorithm 算法,例如:RSA * @return 公私钥对 */ @GetMapping("/api/signature/generateKeyPair") - ApiResult generateKeyPair(@RequestParam(value = "algorithm") String algorithm); + ApiResult> generateKeyPair(@RequestParam(value = "algorithm") String algorithm); } diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java index cc007575..2a8226ff 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java @@ -3,11 +3,15 @@ package cn.axzo.nanopart.server.controller; import cn.axzo.framework.domain.ServiceException; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.api.SignatureUtilApi; +import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; +import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; import java.security.KeyPair; +import java.util.HashMap; +import java.util.Map; /** * @author chenwenjian @@ -18,14 +22,17 @@ import java.security.KeyPair; @RestController public class SignatureUtilController implements SignatureUtilApi { @Override - public ApiResult generateKeyPair(String algorithm) { + public ApiResult> generateKeyPair(String algorithm) { log.info("algorithm = {}", algorithm); - KeyPair keyPair = null; + Map keyPair = new HashMap<>(); try { - keyPair = SecureUtil.generateKeyPair(algorithm); + KeyPair generateKeyPair = SecureUtil.generateKeyPair(algorithm); + keyPair.put("publicKey", Base64.encode(generateKeyPair.getPublic().getEncoded())); + keyPair.put("privateKey", Base64.encode(generateKeyPair.getPrivate().getEncoded())); } catch (Exception e) { throw new ServiceException("密钥对生成失败"); } + log.info("keyPair = {}", JSONUtil.toJsonStr(keyPair)); return ApiResult.ok(keyPair); } } From 86d7501f01cc9150809ec8fa4baad3764e09fff7 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Wed, 3 Jan 2024 21:07:33 +0800 Subject: [PATCH 06/12] =?UTF-8?q?feat(REQ-2040):=20=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- .../nanopart/api/BlackAndWhiteListApi.java | 36 ++++ .../nanopart/api/aspect/CheckSignAspect.java | 13 +- .../config/NanopartApiAutoConfiguration.java | 5 +- ...nt.java => BlackAndWhiteListConstant.java} | 2 +- .../api/request/BlackAndWhiteListInReq.java | 4 +- .../BlackAndWhiteListInternalSyncReq.java | 53 ++++++ .../BlackAndWhiteListPlatformSyncReq.java | 78 ++++++++ .../api/request/BlackAndWhiteListReq.java | 6 + black-list/black-list-service/pom.xml | 4 + .../constant/BlackAndWhiteListConstant.java | 19 ++ .../BlackAndWhiteListController.java | 37 +++- .../BlackAndWhiteListRepository.java | 67 +++++-- .../service/BlackAndWhiteListService.java | 14 +- .../impl/BlackAndWhiteListServiceImpl.java | 168 ++++++++++++++++-- .../cn/axzo/nanopart/NanopartApplication.java | 2 + 16 files changed, 480 insertions(+), 39 deletions(-) rename black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/{NanopartConstant.java => BlackAndWhiteListConstant.java} (87%) create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListInternalSyncReq.java create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListPlatformSyncReq.java create mode 100644 black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/constant/BlackAndWhiteListConstant.java diff --git a/README.md b/README.md index 0680e5ba..807d60a4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # 项目介绍 -一个通用的聚合服务:通用黑名单服务 +一个通用的聚合服务: +* 通用黑白名单服务 # vm参数 ## dev环境 @@ -18,13 +19,19 @@ -DCUSTOM_ENV=test -Dserver.port=8080 -# 各模块结构 +# 黑白名单中各模块结构 ## all-login 登录白名单 ~~~json { "phone": "手机号" } ~~~ +## ou_register_black_list 企业注册黑名单 +~~~json +{ + "phone": "手机号" +} +~~~ ## attendance-pass 考勤黑名单 ~~~json { diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java index 1a1bba5a..ce7e16e3 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java @@ -1,8 +1,11 @@ package cn.axzo.nanopart.api; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.annotation.CheckSign; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; import cn.axzo.nanopart.api.request.BlackAndWhiteListExcelImportReq; +import cn.axzo.nanopart.api.request.BlackAndWhiteListInternalSyncReq; +import cn.axzo.nanopart.api.request.BlackAndWhiteListPlatformSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; @@ -13,6 +16,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import javax.validation.constraints.NotBlank; @@ -84,4 +88,36 @@ public interface BlackAndWhiteListApi { @PostMapping("api/black-white-list/import") ApiResult importBlackAndWhiteListExcel(@RequestParam(value = "type") @NotNull(message = "名单类型不能为空") ListTypeEnum type, @RequestParam(value = "module") @NotBlank(message = "模块不能为空") String module, @RequestParam(value = "url", required = false) String url, @RequestPart(value = "file") MultipartFile file); + + /** + * 平台同步黑白名单 + *

+ * 每次最多同步1000条记录且整体上同步策略采用增量更新策略, + * 若总记录数超过1000条请自行分片多次调用 + *

+ * + *

+ * 该接口需要验签,参与签名的字段为header中的:appKey,timestamp, + * 签名字段为header中的sign + *

+ * + * @param req @{link BlackAndWhiteListPlatformSyncReq} + * @return true-同步成功,false-同步失败 + */ + @PostMapping("api/black-white-list/plat-sync") + ApiResult platformSync(@RequestBody @Validated BlackAndWhiteListPlatformSyncReq req); + + /** + * TODO 该接口目前耗时较长待优化 + * 内部自同步黑白名单 + *

+ * 例如将其他模块的黑名单同步到登录模块黑名单 + *

+ * + * @param req @{link BlackAndWhiteListInternalSyncReq} + * @return 同步结果,成功返回同步记录总数 + */ + @CheckSign + @PostMapping("api/black-white-list/inner-sync") + ApiResult internalSync(@RequestBody @Validated BlackAndWhiteListInternalSyncReq req); } diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java index 3e9a01c9..208dd05a 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java @@ -46,6 +46,7 @@ public class CheckSignAspect { @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PostMapping)") public void postMapping() { + log.info("post"); } @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.GetMapping)") @@ -68,10 +69,14 @@ public class CheckSignAspect { public void mappingAnnotations() { } + // @Pointcut(value = "@annotation(cn.axzo.nanopart.api.annotation.CheckSign)") + // public void checkSign() { + // } + /** * 切入含有@CheckSign && @RestController 注解的类 */ - @Before(value = "@within(checkSign) && @within(restController)") + @Before(value = "@within(checkSign) && @within(restController)", argNames = "joinPoint,checkSign,restController") public void classHandler(JoinPoint joinPoint, CheckSign checkSign, RestController restController) { handle(joinPoint, checkSign); } @@ -127,7 +132,11 @@ public class CheckSignAspect { if (StringUtils.isBlank(value)) { throw new BizException(new RespCode("403", "验签失败")); } - data.append(field).append("=").append(value).append("&"); + data.append(field).append("=").append(value); + // 判断最后一个字段,如果是最后一个字段则不拼接"&" + if (field.equals(checkSign.requireSignFields()[checkSign.requireSignFields().length - 1])) { + data.append("&"); + } } } log.info("data:{}", data); diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java index 816d5e34..8ff5ab3f 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java @@ -1,9 +1,10 @@ package cn.axzo.nanopart.api.config; -import cn.axzo.nanopart.api.constant.NanopartConstant; +import cn.axzo.nanopart.api.constant.BlackAndWhiteListConstant; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.EnableAspectJAutoProxy; -@EnableFeignClients(NanopartConstant.BASIC_FEIGN_PACKAGE) +@EnableFeignClients(BlackAndWhiteListConstant.BASIC_FEIGN_PACKAGE) public class NanopartApiAutoConfiguration { } diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/BlackAndWhiteListConstant.java similarity index 87% rename from black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java rename to black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/BlackAndWhiteListConstant.java index bd12bdf2..21eee5e4 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/constant/BlackAndWhiteListConstant.java @@ -7,7 +7,7 @@ package cn.axzo.nanopart.api.constant; * @modifiedBy: * @version: 1.0 */ -public class NanopartConstant { +public class BlackAndWhiteListConstant { public static final String BASIC_FEIGN_PACKAGE = "cn.axzo.nanopart.api"; public static final String PHONE_REGEXP = "^1[3456789]\\d{9}$"; diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListInReq.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListInReq.java index 7c336867..78480b08 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListInReq.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListInReq.java @@ -1,7 +1,7 @@ package cn.axzo.nanopart.api.request; -import cn.axzo.nanopart.api.constant.NanopartConstant; +import cn.axzo.nanopart.api.constant.BlackAndWhiteListConstant; import lombok.Data; import javax.validation.constraints.NotBlank; @@ -21,6 +21,6 @@ public class BlackAndWhiteListInReq { @NotBlank(message = "模块名称不能为空格") private String module; - @Pattern(regexp = NanopartConstant.PHONE_REGEXP,message = "手机号格式错误") + @Pattern(regexp = BlackAndWhiteListConstant.PHONE_REGEXP,message = "手机号格式错误") private String phone; } diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListInternalSyncReq.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListInternalSyncReq.java new file mode 100644 index 00000000..59fb9529 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListInternalSyncReq.java @@ -0,0 +1,53 @@ +package cn.axzo.nanopart.api.request; + +import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 黑白名单内部自同步请求 + * + * @author chenwenjian + * @version 1.0 + * @date 2024/1/3 16:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BlackAndWhiteListInternalSyncReq { + + @NotNull(message = "同步类型不能为空") + private ListTypeEnum type; + + /** + * 同步源模块 + */ + @NotBlank(message = "同步源模块不能为空") + private String sourceModule; + + /** + * 同步源字段 + */ + @NotEmpty(message = "同步源字段不能为空") + private List sourceFields; + + /** + * 同步目标模块 + */ + @NotBlank(message = "同步目标模块不能为空") + private String targetModule; + + /** + * 同步目标字段 + */ + @NotEmpty(message = "同步目标字段不能为空") + private List targetFields; +} diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListPlatformSyncReq.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListPlatformSyncReq.java new file mode 100644 index 00000000..b78522bd --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListPlatformSyncReq.java @@ -0,0 +1,78 @@ +package cn.axzo.nanopart.api.request; + +import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; + +/** + * 黑白名单平台同步请求 + * + * @author chenwenjian + * @version 1.0 + * @date 2024/1/2 18:17 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BlackAndWhiteListPlatformSyncReq { + + /** + * 名单类型,0为黑名单,1为白名单 + */ + @NotNull(message = "名单类型错误") + private ListTypeEnum type; + + /** + * 模块名,自主定义,例:cms-login + */ + @NotBlank(message = "模块名不能为空") + private String module; + + /** + * 参数,例:[{"name":"username","value":"admin"},{"name":"password","value":"123456"}] + * 单次同步数量最多1000条 + */ + @NotEmpty(message = "参数不能为空") + private List> params; + + /** + * 同步时使用的业务唯一字段名,例:username + */ + @NotBlank(message = "同步时使用的业务唯一字段名") + private String businessUniqueField; + + /** + * 是否同步至登录黑名单 + */ + private Boolean isSyncLogin; + + /** + * 同步至登录黑名单时params中代表手机号的字段名,例:userPhone + *

+ * 因为目前登录黑名单以手机号作为判断依据,所以当isSyncLogin为true时此字段必填 + *

+ */ + private String syncLoginField; + + /** + * 是否同步至注册黑名单 + */ + private Boolean isSyncRegister; + + /** + * 同步至注册黑名单时params中代表手机号的字段名,例:userPhone + *

+ * 因为目前注册黑名单以手机号作为判断依据,所以当isSyncRegister为true时此字段必填 + *

+ */ + private String syncRegisterField; +} \ No newline at end of file diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListReq.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListReq.java index 1b2e0b8e..650bedc2 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListReq.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListReq.java @@ -1,7 +1,10 @@ package cn.axzo.nanopart.api.request; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -15,6 +18,9 @@ import java.util.Map; * @version: 1.0 */ @Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class BlackAndWhiteListReq { /** diff --git a/black-list/black-list-service/pom.xml b/black-list/black-list-service/pom.xml index 3cd31852..5cb4d37e 100644 --- a/black-list/black-list-service/pom.xml +++ b/black-list/black-list-service/pom.xml @@ -33,5 +33,9 @@ black-list-api 2.0.0-SNAPSHOT + + org.springframework.cloud + spring-cloud-context + diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/constant/BlackAndWhiteListConstant.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/constant/BlackAndWhiteListConstant.java new file mode 100644 index 00000000..25d6c7d5 --- /dev/null +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/constant/BlackAndWhiteListConstant.java @@ -0,0 +1,19 @@ +package cn.axzo.nanopart.server.constant; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2024/1/3 11:28 + */ +public class BlackAndWhiteListConstant { + + /** + * 所有平台登录黑名单模块名 + */ + public static final String ALL_LOGIN = "all-login"; + + /** + * 企业注册黑名单模块名 + */ + public static final String OU_REGISTER_BLACK_LIST = "ou_register_black_list"; +} diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/BlackAndWhiteListController.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/BlackAndWhiteListController.java index fee9a255..e5ef8c66 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/BlackAndWhiteListController.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/BlackAndWhiteListController.java @@ -3,13 +3,17 @@ package cn.axzo.nanopart.server.controller; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.api.BlackAndWhiteListApi; +import cn.axzo.nanopart.api.annotation.CheckSign; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; import cn.axzo.nanopart.api.request.BlackAndWhiteListExcelImportReq; +import cn.axzo.nanopart.api.request.BlackAndWhiteListInternalSyncReq; +import cn.axzo.nanopart.api.request.BlackAndWhiteListPlatformSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import cn.axzo.nanopart.server.service.BlackAndWhiteListService; +import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; @@ -44,12 +48,12 @@ public class BlackAndWhiteListController implements BlackAndWhiteListApi { @Override public ApiResult create(BlackAndWhiteListReq req) { - return blackAndWhiteListService.create(req); + return ApiResult.ok(blackAndWhiteListService.create(req)); } @Override public ApiResult delete(BlackAndWhiteListReq req) { - return blackAndWhiteListService.delete(req); + return ApiResult.ok(blackAndWhiteListService.delete(req)); } @Override @@ -59,12 +63,12 @@ public class BlackAndWhiteListController implements BlackAndWhiteListApi { @Override public ApiResult> detail(BlackAndWhiteListReq req) { - return blackAndWhiteListService.detail(req); + return ApiResult.ok(blackAndWhiteListService.detail(req)); } @Override public ApiResult isInBlackOrWhiteList(BlackAndWhiteListReq req) { - return blackAndWhiteListService.isInBlackOrWhiteList(req); + return ApiResult.ok(blackAndWhiteListService.isInBlackOrWhiteList(req)); } @Override @@ -73,4 +77,29 @@ public class BlackAndWhiteListController implements BlackAndWhiteListApi { return ApiResult.ok(blackAndWhiteListService.importBlackAndWhiteListExcel(type, module, url, file)); } + /** + * 平台同步黑白名单 + * + * @param req @{link BlackAndWhiteListPlatformSyncReq} + * @return + */ + @CheckSign(requireSignFields = {"appKey", "timestamp"}) + @Override + public ApiResult platformSync(BlackAndWhiteListPlatformSyncReq req) { + log.info("平台同步参数:req = {}", JSONUtil.toJsonStr(req)); + return ApiResult.ok(blackAndWhiteListService.platformSync(req)); + } + + /** + * 内部自同步黑白名单 + * + * @param req @{link BlackAndWhiteListInternalSyncReq} + * @return 同步结果的记录id + */ + @CheckSign(requireSignFields = {"appKey", "timestamp"}) + @Override + public ApiResult internalSync(BlackAndWhiteListInternalSyncReq req) { + return ApiResult.ok(blackAndWhiteListService.internalSync(req)); + } + } diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java index 4c69e6de..5af333e5 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java @@ -7,6 +7,7 @@ import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import cn.axzo.nanopart.server.dao.mapper.BlackAndWhiteListMapper; import cn.azxo.framework.common.utils.StringUtils; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; @@ -33,7 +34,7 @@ public class BlackAndWhiteListRepository extends ServiceImpl saasBlackWhiteList.setType(req1.getType().getValue())); Date nowTime = new Date(System.currentTimeMillis()); blackWhiteList.setCreateAt(nowTime); @@ -44,13 +45,13 @@ public class BlackAndWhiteListRepository extends ServiceImpl blackWhiteLists = detail(req); - if (CollectionUtil.isNotEmpty(blackWhiteLists)){ + if (CollectionUtil.isNotEmpty(blackWhiteLists)) { blackWhiteLists.forEach(saasBlackWhiteList -> { - lambdaUpdate().eq(SaasBlackWhiteList::getId,saasBlackWhiteList.getId()) - .eq(SaasBlackWhiteList::getIsDelete,0) - .set(SaasBlackWhiteList::getIsDelete,saasBlackWhiteList.getId()) + lambdaUpdate().eq(SaasBlackWhiteList::getId, saasBlackWhiteList.getId()) + .eq(SaasBlackWhiteList::getIsDelete, 0) + .set(SaasBlackWhiteList::getIsDelete, saasBlackWhiteList.getId()) .update(); - log.info("deleted record:{}", JSONObject.valueToString(saasBlackWhiteList)); + log.info("deleted record:{}", JSONUtil.toJsonStr(saasBlackWhiteList)); }); } return null; @@ -58,10 +59,10 @@ public class BlackAndWhiteListRepository extends ServiceImpl detail(BlackAndWhiteListReq req) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("type",req.getType().getValue()) - .eq(StringUtils.isNotBlank(req.getModule()),"module",req.getModule()) - .eq("is_delete",0) - .groupBy("type","param"); + queryWrapper.eq("type", req.getType().getValue()) + .eq(StringUtils.isNotBlank(req.getModule()), "module", req.getModule()) + .eq("is_delete", 0) + .groupBy("type", "param"); buildQueryWrapper(queryWrapper, req.getParam(), ""); return blackAndWhiteListMapper.selectList(queryWrapper); } @@ -83,4 +84,50 @@ public class BlackAndWhiteListRepository extends ServiceImpl param) { + return lambdaUpdate() + .eq(SaasBlackWhiteList::getIsDelete, id) + .eq(SaasBlackWhiteList::getIsDelete, 0) + .set(SaasBlackWhiteList::getParam, param) + .update(); + } + + /** + * 根据模块名获取名单 + * + * @param type 名单类型 + * @param module 模块名 + * @return 名单列表 + */ + public List getListByModule(Integer type, String module) { + return lambdaQuery() + .eq(SaasBlackWhiteList::getType, type) + .eq(SaasBlackWhiteList::getModule, module) + .eq(SaasBlackWhiteList::getIsDelete, 0) + .list(); + } } \ No newline at end of file diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java index 4ceeed1f..a68301fb 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/BlackAndWhiteListService.java @@ -2,6 +2,8 @@ package cn.axzo.nanopart.server.service; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import cn.axzo.nanopart.api.request.BlackAndWhiteListInternalSyncReq; +import cn.axzo.nanopart.api.request.BlackAndWhiteListPlatformSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; @@ -19,15 +21,19 @@ import java.util.List; */ public interface BlackAndWhiteListService { - ApiResult create(BlackAndWhiteListReq req); + Long create(BlackAndWhiteListReq req); - ApiResult delete(BlackAndWhiteListReq req); + Void delete(BlackAndWhiteListReq req); - ApiResult> detail(BlackAndWhiteListReq req); + List detail(BlackAndWhiteListReq req); - ApiResult isInBlackOrWhiteList(BlackAndWhiteListReq req); + Boolean isInBlackOrWhiteList(BlackAndWhiteListReq req); BlackAndWhiteListExcelImportResp importBlackAndWhiteListExcel(ListTypeEnum type, String module, String url, MultipartFile file); Boolean deleteByIds(List ids); + + Boolean platformSync(BlackAndWhiteListPlatformSyncReq req); + + Long internalSync(BlackAndWhiteListInternalSyncReq req); } diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java index 6452b9e8..97c977ee 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java @@ -2,20 +2,26 @@ package cn.axzo.nanopart.server.service.impl; import cn.axzo.basics.common.BeanMapper; import cn.axzo.basics.common.exception.ServiceException; -import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import cn.axzo.nanopart.api.request.BlackAndWhiteListInternalSyncReq; +import cn.axzo.nanopart.api.request.BlackAndWhiteListPlatformSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; import cn.axzo.nanopart.api.response.BlackAndWhiteListExcelImportResp; import cn.axzo.nanopart.api.response.BlackAndWhiteListResp; +import cn.axzo.nanopart.server.constant.BlackAndWhiteListConstant; import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList; import cn.axzo.nanopart.server.dao.repository.BlackAndWhiteListRepository; import cn.axzo.nanopart.server.service.BlackAndWhiteListService; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; +import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; @@ -24,11 +30,14 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** @@ -40,11 +49,18 @@ import java.util.stream.Collectors; */ @Slf4j @Service +@RefreshScope @RequiredArgsConstructor public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { private final BlackAndWhiteListRepository blackAndWhiteListRepository; + /** + * 黑白名单外部平台单次最大同步记录数 + */ + @Value("${sync.fragmentSize:1000}") + private Long fragmentSize; + /** * 新增一条黑白名单记录 * @@ -52,17 +68,17 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { * @return 记录id */ @Override - public ApiResult create(BlackAndWhiteListReq req) { + public Long create(BlackAndWhiteListReq req) { // 黑白名单创建互斥,若存在于黑名单中则不允许存在于白名单中,反之亦然 BlackAndWhiteListReq reverseReq = BeanMapper.copyBean(req, BlackAndWhiteListReq.class, (req1, req2) -> req2.setType((req1.getType().equals(ListTypeEnum.BLACK_LIST)) ? ListTypeEnum.WHITE_LIST : ListTypeEnum.BLACK_LIST)); - if (isInBlackOrWhiteList(reverseReq).getData()) { + if (isInBlackOrWhiteList(reverseReq)) { throw new ServiceException("该记录已存在于" + reverseReq.getType().getDescription() + "中,不能创建对应" + req.getType().getDescription()); } // 同类型名单内唯一性校验 - if (isInBlackOrWhiteList(req).getData()) { + if (isInBlackOrWhiteList(req)) { throw new ServiceException("该记录已存在于" + req.getType().getDescription() + "中"); } - return ApiResult.ok(blackAndWhiteListRepository.create(req)); + return blackAndWhiteListRepository.create(req); } /** @@ -72,8 +88,8 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { * @return null */ @Override - public ApiResult delete(BlackAndWhiteListReq req) { - return ApiResult.ok(blackAndWhiteListRepository.delete(req)); + public Void delete(BlackAndWhiteListReq req) { + return blackAndWhiteListRepository.delete(req); } /** @@ -83,10 +99,9 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { * @return 记录列表 */ @Override - public ApiResult> detail(BlackAndWhiteListReq req) { + public List detail(BlackAndWhiteListReq req) { List saasBlackWhiteLists = blackAndWhiteListRepository.detail(req); - List blackAndWhiteListResps = BeanMapper.copyList(saasBlackWhiteLists, BlackAndWhiteListResp.class); - return ApiResult.ok(blackAndWhiteListResps); + return BeanMapper.copyList(saasBlackWhiteLists, BlackAndWhiteListResp.class); } /** @@ -96,9 +111,9 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { * @return 记录存在返回true,否则返回false */ @Override - public ApiResult isInBlackOrWhiteList(BlackAndWhiteListReq req) { + public Boolean isInBlackOrWhiteList(BlackAndWhiteListReq req) { List blackWhiteLists = blackAndWhiteListRepository.detail(req); - return ApiResult.ok(CollectionUtil.isNotEmpty(blackWhiteLists)); + return CollectionUtil.isNotEmpty(blackWhiteLists); } /** @@ -144,6 +159,135 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { return true; } + /** + * 平台同步黑白名单 + * + * @param req {@link BlackAndWhiteListPlatformSyncReq} + * @return true-同步成功,false-同步失败 + */ + @Override + public Boolean platformSync(BlackAndWhiteListPlatformSyncReq req) { + if (Objects.isNull(req.getType())) { + throw new ServiceException("请选择正确的名单类型"); + } + if (req.getParams().size() > fragmentSize) { + throw new ServiceException("请主动进行分片多次同步,单次同步数小于" + fragmentSize + "条数据"); + } + // 存入本次同步的黑/白名单记录 + req.getParams().forEach(param -> { + HashMap map = new HashMap<>(); + map.put(req.getBusinessUniqueField(), param.get(req.getBusinessUniqueField())); + List detail = detail(BlackAndWhiteListReq.builder() + .type(req.getType()) + .module(req.getModule()) + .param(map) + .build()); + // 该记录原来不存在,即未同步过,直接新增一条 + if (detail.size() == 0) { + create(BlackAndWhiteListReq.builder() + .type(req.getType()) + .module(req.getModule()) + .param(param) + .build()); + } else if (detail.size() == 1) { + updateParamById(detail.get(0).getId(), param); + } else { + log.warn("指定唯一字段:{},不唯一记录:{}", req.getBusinessUniqueField(), JSONUtil.toJsonStr(detail)); + throw new ServiceException("请检查指定的【业务唯一字段名:" + req.getBusinessUniqueField() + "】是否正确,记录中存在不唯一值"); + } + }); + // 同步至登录黑名单 + if (Objects.nonNull(req.getIsSyncLogin()) && req.getIsSyncLogin()){ + internalSync(BlackAndWhiteListInternalSyncReq.builder() + .type(req.getType()) + .sourceModule(req.getModule()) + .sourceFields(Collections.singletonList(req.getSyncLoginField())) + .targetModule(BlackAndWhiteListConstant.ALL_LOGIN).build()); + } + // 同步至注册黑名单 + if (Objects.nonNull(req.getIsSyncRegister()) && req.getIsSyncRegister()){ + internalSync(BlackAndWhiteListInternalSyncReq.builder() + .type(req.getType()) + .sourceModule(req.getModule()) + .sourceFields(Collections.singletonList(req.getSyncRegisterField())) + .targetModule(BlackAndWhiteListConstant.OU_REGISTER_BLACK_LIST).build()); + } + return true; + } + + /** + * 内部自同步黑白名单 + * + * @param req {@link BlackAndWhiteListInternalSyncReq} + * @return 同步成功的记录总条数 + */ + public Long internalSync(BlackAndWhiteListInternalSyncReq req) { + AtomicReference count = new AtomicReference<>(0L); + // 获取所有源记录 + List sourceList = blackAndWhiteListRepository.getListByModule(req.getType().getValue(), req.getSourceModule()); + + sourceList.stream().map(s -> { + // 抽取出需要同步的字段值 + HashMap map = new HashMap<>(); + req.getSourceFields().forEach(sf -> map.put(sf, s.getParam().get(sf))); + return map; + }).forEach(m -> { + // 判断是否存在目标记录,不存在则新增一条 + if (!isInBlackOrWhiteList(BlackAndWhiteListReq.builder() + .type(req.getType()) + .module(req.getTargetModule()) + .param(m) + .build())) { + create(BlackAndWhiteListReq.builder() + .type(req.getType()) + .module(req.getTargetModule()) + .param(m) + .build()); + count.getAndSet(count.get() + 1); + } + }); + return count.get(); + } + + /** + * 获取指定模块名的所有黑/白名单记录 + * + * @param type 名单类型 + * @param module 模块名 + * @return 黑/白名单记录列表 + */ + public List getListByModule(ListTypeEnum type, String module) { + return BeanMapper.copyList(blackAndWhiteListRepository.getListByModule(type.getValue(), module), BlackAndWhiteListResp.class); + } + + /** + * 更新指定id的黑白名单记录 + * + * @param id 记录id + * @param param 记录参数 + * @return true-更新成功,false-更新失败 + */ + public boolean updateParamById(Long id, Map param) { + return blackAndWhiteListRepository.updateParamById(id, param); + } + + /** + * 删除指定模块名的所有黑/白名单记录 + * + * @param type 名单类型 + * @param module 模块名 + * @return true-删除成功,false-删除失败 + */ + public Boolean deleteByModule(ListTypeEnum type, String module) { + if (Objects.isNull(type)) { + throw new ServiceException("待删除名单类型不能为空"); + } + if (!StringUtils.hasText(module)) { + throw new ServiceException("待删除模块名不能为空"); + } + return blackAndWhiteListRepository.deleteByModule(type.getValue(), module); + } + /** * 使用EasyExcel读取Excel数据 * diff --git a/nanopart-server/src/main/java/cn/axzo/nanopart/NanopartApplication.java b/nanopart-server/src/main/java/cn/axzo/nanopart/NanopartApplication.java index b5eccb60..8cf18f79 100644 --- a/nanopart-server/src/main/java/cn/axzo/nanopart/NanopartApplication.java +++ b/nanopart-server/src/main/java/cn/axzo/nanopart/NanopartApplication.java @@ -4,12 +4,14 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.EnableAspectJAutoProxy; @MapperScan(value = {"cn.axzo.**.mapper"}) @SpringBootApplication @EnableFeignClients(basePackages = { "cn.axzo.nanopart.api" }) +@EnableAspectJAutoProxy() public class NanopartApplication { public static void main(String[] args) { SpringApplication.run(NanopartApplication.class, args); From dd9fd06516eb51fa8f8d3e3a5659bd3770738088 Mon Sep 17 00:00:00 2001 From: luofu Date: Wed, 3 Jan 2024 21:43:24 +0800 Subject: [PATCH 07/12] =?UTF-8?q?feat(REQ-2040):=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nanopart/api/BlackAndWhiteListApi.java | 5 -- .../nanopart/api/aspect/CheckSignAspect.java | 70 +++++-------------- 2 files changed, 16 insertions(+), 59 deletions(-) diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java index ce7e16e3..d12961cb 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java @@ -1,9 +1,7 @@ package cn.axzo.nanopart.api; import cn.axzo.framework.domain.web.result.ApiResult; -import cn.axzo.nanopart.api.annotation.CheckSign; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; -import cn.axzo.nanopart.api.request.BlackAndWhiteListExcelImportReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListInternalSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListPlatformSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; @@ -16,13 +14,11 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -import java.io.IOException; import java.util.List; /** @@ -117,7 +113,6 @@ public interface BlackAndWhiteListApi { * @param req @{link BlackAndWhiteListInternalSyncReq} * @return 同步结果,成功返回同步记录总数 */ - @CheckSign @PostMapping("api/black-white-list/inner-sync") ApiResult internalSync(@RequestBody @Validated BlackAndWhiteListInternalSyncReq req); } diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java index 208dd05a..f8c518e6 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java @@ -5,23 +5,23 @@ import cn.axzo.framework.domain.web.code.RespCode; import cn.axzo.nanopart.api.annotation.CheckSign; import cn.axzo.nanopart.api.config.SignManager; import cn.hutool.core.util.ArrayUtil; -import lombok.SneakyThrows; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; - +import java.lang.reflect.Method; import java.util.Collections; import java.util.Enumeration; import java.util.Objects; @@ -35,64 +35,26 @@ import java.util.Objects; @Aspect @Order(1) @Component +@RequiredArgsConstructor public class CheckSignAspect { - @Resource - private SignManager signManager; + private final SignManager signManager; - @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.RequestMapping)") - public void requestMapping() { + @Pointcut(value = "@annotation(cn.axzo.nanopart.api.annotation.CheckSign)") + public void checkSign() { } - @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PostMapping)") - public void postMapping() { - log.info("post"); - } - - @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.GetMapping)") - public void getMapping() { - } - - @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PutMapping)") - public void putMapping() { - } - - @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.DeleteMapping)") - public void deleteMapping() { - } - - @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PatchMapping)") - public void patchMapping() { - } - - @Pointcut("requestMapping() || postMapping() || getMapping() || putMapping() || deleteMapping()|| patchMapping()") - public void mappingAnnotations() { - } - - // @Pointcut(value = "@annotation(cn.axzo.nanopart.api.annotation.CheckSign)") - // public void checkSign() { - // } - /** * 切入含有@CheckSign && @RestController 注解的类 */ - @Before(value = "@within(checkSign) && @within(restController)", argNames = "joinPoint,checkSign,restController") - public void classHandler(JoinPoint joinPoint, CheckSign checkSign, RestController restController) { - handle(joinPoint, checkSign); - } - - /** - * 切入含有@checkSign && @RequestMapping/@PostMapping/@GetMapping/@PutMapping/@DeleteMapping/@PatchMapping 之一注解的方法 - */ - @Before(value = "@annotation(checkSign) && mappingAnnotations()") - public void methodHandler(JoinPoint joinPoint, CheckSign checkSign) { - handle(joinPoint, checkSign); - } - - @SneakyThrows - public void handle(JoinPoint joinPoint, CheckSign checkSign) { - // 验签 - verifySignature(checkSign); + @Before("checkSign()") + public void verifySignature(JoinPoint joinPoint) { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + CheckSign authorizeAnnotation = method.getAnnotation(CheckSign.class); + log.info("before......"); + verifySignature(authorizeAnnotation); } private void verifySignature(CheckSign checkSign) { From 96f59473ac511d1643ff2897e1eb34526e672c2f Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Thu, 4 Jan 2024 14:37:56 +0800 Subject: [PATCH 08/12] =?UTF-8?q?feat(REQ-2040):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=AD=BE=E5=90=8D=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=AA=8C=E7=AD=BEaop=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nanopart/api/BlackAndWhiteListApi.java | 4 + .../axzo/nanopart/api/SignatureUtilApi.java | 15 ++- .../nanopart/api/aspect/CheckSignAspect.java | 120 ++++++++++++------ .../nanopart/api/common/util/StringUtil.java | 35 +++++ .../axzo/nanopart/api/config/SignManager.java | 2 +- .../nanopart/api/request/SignatureGetReq.java | 35 +++++ .../controller/SignatureUtilController.java | 28 ++++ 7 files changed, 201 insertions(+), 38 deletions(-) create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/common/util/StringUtil.java create mode 100644 black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/SignatureGetReq.java diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java index d12961cb..13eb4836 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java @@ -1,7 +1,9 @@ package cn.axzo.nanopart.api; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.annotation.CheckSign; import cn.axzo.nanopart.api.constant.enums.ListTypeEnum; +import cn.axzo.nanopart.api.request.BlackAndWhiteListExcelImportReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListInternalSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListPlatformSyncReq; import cn.axzo.nanopart.api.request.BlackAndWhiteListReq; @@ -14,11 +16,13 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import java.io.IOException; import java.util.List; /** diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java index 543a1763..9d63fa35 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/SignatureUtilApi.java @@ -1,8 +1,12 @@ package cn.axzo.nanopart.api; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.request.SignatureGetReq; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.security.KeyPair; @@ -24,6 +28,15 @@ public interface SignatureUtilApi { * @param algorithm 算法,例如:RSA * @return 公私钥对 */ - @GetMapping("/api/signature/generateKeyPair") + @GetMapping("api/signature/generateKeyPair") ApiResult> generateKeyPair(@RequestParam(value = "algorithm") String algorithm); + + /** + * 获取签名 + * + * @param req 请求 + * @return 签名 + */ + @PostMapping("api/signature/getSignature") + ApiResult getSignature(@RequestBody @Validated SignatureGetReq req); } diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java index f8c518e6..704bb61d 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/aspect/CheckSignAspect.java @@ -3,28 +3,34 @@ package cn.axzo.nanopart.api.aspect; import cn.axzo.framework.domain.web.BizException; import cn.axzo.framework.domain.web.code.RespCode; import cn.axzo.nanopart.api.annotation.CheckSign; +import cn.axzo.nanopart.api.common.util.StringUtil; import cn.axzo.nanopart.api.config.SignManager; import cn.hutool.core.util.ArrayUtil; -import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import java.lang.reflect.Method; + import java.util.Collections; +import java.util.Comparator; import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * @author chenwenjian @@ -35,33 +41,76 @@ import java.util.Objects; @Aspect @Order(1) @Component -@RequiredArgsConstructor public class CheckSignAspect { - private final SignManager signManager; + @Resource + private SignManager signManager; - @Pointcut(value = "@annotation(cn.axzo.nanopart.api.annotation.CheckSign)") - public void checkSign() { + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.RequestMapping)") + public void requestMapping() { } + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PostMapping)") + public void postMapping() { + log.info("post"); + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.GetMapping)") + public void getMapping() { + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PutMapping)") + public void putMapping() { + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.DeleteMapping)") + public void deleteMapping() { + } + + @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PatchMapping)") + public void patchMapping() { + } + + @Pointcut("requestMapping() || postMapping() || getMapping() || putMapping() || deleteMapping()|| patchMapping()") + public void mappingAnnotations() { + } + + // @Pointcut(value = "@annotation(cn.axzo.nanopart.api.annotation.CheckSign)") + // public void checkSign() { + // } + /** * 切入含有@CheckSign && @RestController 注解的类 */ - @Before("checkSign()") - public void verifySignature(JoinPoint joinPoint) { - Signature signature = joinPoint.getSignature(); - MethodSignature methodSignature = (MethodSignature) signature; - Method method = methodSignature.getMethod(); - CheckSign authorizeAnnotation = method.getAnnotation(CheckSign.class); - log.info("before......"); - verifySignature(authorizeAnnotation); + @Before(value = "@within(checkSign) && @within(restController)", argNames = "joinPoint,checkSign,restController") + public void classHandler(JoinPoint joinPoint, CheckSign checkSign, RestController restController) { + handle(joinPoint, checkSign); } + /** + * 切入含有@checkSign && @RequestMapping/@PostMapping/@GetMapping/@PutMapping/@DeleteMapping/@PatchMapping 之一注解的方法 + */ + @Before(value = "@annotation(checkSign)") + public void methodHandler(JoinPoint joinPoint, CheckSign checkSign) { + handle(joinPoint, checkSign); + } + + @SneakyThrows + public void handle(JoinPoint joinPoint, CheckSign checkSign) { + // 验签 + verifySignature(checkSign); + } + + /** + * 验签 + * + * @param checkSign 注解,包含签名字段名等配置 + */ private void verifySignature(CheckSign checkSign) { HttpServletRequest httpRequest = ((ServletRequestAttributes) Objects .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); - // 获取调用方 + // 获取调用方appKey,检查是否是受信任调用方 String appKey = httpRequest.getHeader("appKey"); if (StringUtils.isEmpty(appKey)) { throw new BizException(new RespCode("403", "验签失败")); @@ -73,38 +122,37 @@ public class CheckSignAspect { throw new BizException(new RespCode("403", "验签失败")); } - // 从Header中获取需要验签的参数字段 - StringBuilder data = new StringBuilder(); + // 从Header中获取需要验签的参数字段,若字段值为空则该字段不计入签名计算 + Map attendFields = new HashMap<>(); + // 无指定字段则所有字段参与计算签名 if (ArrayUtil.isEmpty(checkSign.requireSignFields())) { Enumeration headerNames = httpRequest.getHeaderNames(); - if (CollectionUtils.isEmpty(Collections.list(headerNames))) { - throw new BizException(new RespCode("403", "验签失败")); - } while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); String value = httpRequest.getHeader(headerName); - if (StringUtils.isBlank(value)) { - throw new BizException(new RespCode("403", "验签失败")); - } - data.append(headerName).append("=").append(value).append("&"); + attendFields.put(headerName, value); } } else { + // 有指定参与计算签名的字段,则只提取指定字段参与计算签名 for (String field : checkSign.requireSignFields()) { String value = httpRequest.getHeader(field); - if (StringUtils.isBlank(value)) { - throw new BizException(new RespCode("403", "验签失败")); - } - data.append(field).append("=").append(value); - // 判断最后一个字段,如果是最后一个字段则不拼接"&" - if (field.equals(checkSign.requireSignFields()[checkSign.requireSignFields().length - 1])) { - data.append("&"); - } + attendFields.put(field, value); } } - log.info("data:{}", data); + // 对所有参与签名计算的字段去除空值和去重后按照字段名的ASCII码从小到大排序(字典序) + Map sortedAttendFields = attendFields.entrySet() + .stream() + .filter(entry -> !StringUtils.isEmpty(entry.getValue())) + .distinct() + .sorted(Map.Entry.comparingByKey()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new)); + + // 拼接所有签名数据为字符串 + String data = StringUtil.extracted(sortedAttendFields); + log.info("参与签名计算data:{}", data); try { - boolean verify = signManager.verify(appKey, data.toString(), sign); + boolean verify = signManager.verify(appKey, data, sign); if (!verify) { throw new BizException(new RespCode("403", "验签失败")); } diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/common/util/StringUtil.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/common/util/StringUtil.java new file mode 100644 index 00000000..0fb23dd6 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/common/util/StringUtil.java @@ -0,0 +1,35 @@ +package cn.axzo.nanopart.api.common.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; + +import java.util.Map; + +/** + * @author chenwenjian + * @version 1.0 + * @date 2024/1/4 10:53 + */ +public class StringUtil { + + /** + * 将Map中的参数拼接成字符串 + * + * @param params 键值对 + * @return 拼接后的字符串 + */ + public static String extracted(Map params) { + if (CollectionUtils.isEmpty(params)) { + return StringUtils.EMPTY; + } + StringBuilder data = new StringBuilder(); + for (Map.Entry entry : params.entrySet()) { + if (data.length() > 0) { + data.append("&"); + } + data.append(entry.getKey()).append("=").append(entry.getValue().toString()); + } + return data.toString(); + } + +} diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignManager.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignManager.java index d329bad2..d3121de9 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignManager.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/config/SignManager.java @@ -28,7 +28,7 @@ public class SignManager { * 生成的签名为十六进制字符串 * * @param appKey 调用方 - * @param rawData 待签名数据 + * @param rawData 待签名数据,格式:所有需要参与签名计算的参数去重后按照字段名的ASCII码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串(不包含签名字段) * @return 签名 */ public String sign(String appKey, String rawData) { diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/SignatureGetReq.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/SignatureGetReq.java new file mode 100644 index 00000000..30ef7cc2 --- /dev/null +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/SignatureGetReq.java @@ -0,0 +1,35 @@ +package cn.axzo.nanopart.api.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.Map; + +/** + * 签名获取请求 + * @author chenwenjian + * @version 1.0 + * @date 2024/1/4 10:15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SignatureGetReq { + + /** + * 应用key,例如:nanopart + */ + @NotBlank(message = "appKey不能为空") + private String appKey; + + /** + * 请求参数,需要参与计算签名的数据,例如:{"id":123456,"name":"张三"} + */ + @NotEmpty(message = "params不能为空") + private Map params; +} diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java index 2a8226ff..d4ee91e6 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/controller/SignatureUtilController.java @@ -3,9 +3,13 @@ package cn.axzo.nanopart.server.controller; import cn.axzo.framework.domain.ServiceException; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.api.SignatureUtilApi; +import cn.axzo.nanopart.api.config.SignManager; +import cn.axzo.nanopart.api.request.SignatureGetReq; +import cn.axzo.nanopart.api.common.util.StringUtil; import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; @@ -20,7 +24,17 @@ import java.util.Map; */ @Slf4j @RestController +@RequiredArgsConstructor public class SignatureUtilController implements SignatureUtilApi { + + private final SignManager signManager; + + /** + * 生成密钥对 + * + * @param algorithm 算法 + * @return 密钥对 + */ @Override public ApiResult> generateKeyPair(String algorithm) { log.info("algorithm = {}", algorithm); @@ -35,4 +49,18 @@ public class SignatureUtilController implements SignatureUtilApi { log.info("keyPair = {}", JSONUtil.toJsonStr(keyPair)); return ApiResult.ok(keyPair); } + + /** + * 获取签名 + * + * @param req 请求 + * @return 签名 + */ + @Override + public ApiResult getSignature(SignatureGetReq req) { + String data = StringUtil.extracted(req.getParams()); + return ApiResult.ok(signManager.sign(req.getAppKey(), data)); + } + + } From 85ae5531f3251667ae76cf32d3227908d68c3d8f Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Fri, 5 Jan 2024 11:27:33 +0800 Subject: [PATCH 09/12] =?UTF-8?q?feat(REQ-2040):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/dao/repository/BlackAndWhiteListRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java index 5af333e5..9e06f0e6 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java @@ -110,9 +110,9 @@ public class BlackAndWhiteListRepository extends ServiceImpl param) { return lambdaUpdate() - .eq(SaasBlackWhiteList::getIsDelete, id) + .eq(SaasBlackWhiteList::getId, id) .eq(SaasBlackWhiteList::getIsDelete, 0) - .set(SaasBlackWhiteList::getParam, param) + .set(SaasBlackWhiteList::getParam, JSONUtil.toJsonStr(param)) .update(); } From 632b5b579db06291cf886a656181fdb086758795 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Fri, 5 Jan 2024 14:57:42 +0800 Subject: [PATCH 10/12] =?UTF-8?q?feat(REQ-2040):=20=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4=EF=BC=8C=E9=87=87=E7=94=A8?= =?UTF-8?q?=E5=85=A8=E9=87=8F=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nanopart/api/BlackAndWhiteListApi.java | 2 +- .../BlackAndWhiteListPlatformSyncReq.java | 8 +++-- .../server/dao/entity/SaasBlackWhiteList.java | 8 +++++ .../impl/BlackAndWhiteListServiceImpl.java | 36 +++++++------------ 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java index 13eb4836..99cf81af 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/BlackAndWhiteListApi.java @@ -92,7 +92,7 @@ public interface BlackAndWhiteListApi { /** * 平台同步黑白名单 *

- * 每次最多同步1000条记录且整体上同步策略采用增量更新策略, + * 每次最多同步1000条记录且整体上同步策略采用全量覆盖策略 * 若总记录数超过1000条请自行分片多次调用 *

* diff --git a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListPlatformSyncReq.java b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListPlatformSyncReq.java index b78522bd..81b7e2ab 100644 --- a/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListPlatformSyncReq.java +++ b/black-list/black-list-api/src/main/java/cn/axzo/nanopart/api/request/BlackAndWhiteListPlatformSyncReq.java @@ -6,6 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -45,10 +46,11 @@ public class BlackAndWhiteListPlatformSyncReq { private List> params; /** - * 同步时使用的业务唯一字段名,例:username + * 分片号,从1开始,默认是1,若等于1,则先删除所有上次同步的名单,然后新增本次的名单,若大于1时,则直接新增到黑白名单中 */ - @NotBlank(message = "同步时使用的业务唯一字段名") - private String businessUniqueField; + @Min(value = 1, message = "分片号必须大于1") + @NotNull(message = "分片大小不能为空") + private Long fragment = 1L; /** * 是否同步至登录黑名单 diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java index f6f072c4..bc200b3c 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java @@ -5,7 +5,11 @@ import cn.axzo.framework.data.mybatisplus.model.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import java.util.Map; @@ -16,7 +20,11 @@ import java.util.Map; * @modifiedBy: * @version: 1.0 */ +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor @Data +@Builder @TableName(value = "saas_black_white_list",autoResultMap = true) public class SaasBlackWhiteList extends BaseEntity { diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java index 97c977ee..42c6b42f 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/service/impl/BlackAndWhiteListServiceImpl.java @@ -173,29 +173,17 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { if (req.getParams().size() > fragmentSize) { throw new ServiceException("请主动进行分片多次同步,单次同步数小于" + fragmentSize + "条数据"); } - // 存入本次同步的黑/白名单记录 - req.getParams().forEach(param -> { - HashMap map = new HashMap<>(); - map.put(req.getBusinessUniqueField(), param.get(req.getBusinessUniqueField())); - List detail = detail(BlackAndWhiteListReq.builder() - .type(req.getType()) - .module(req.getModule()) - .param(map) - .build()); - // 该记录原来不存在,即未同步过,直接新增一条 - if (detail.size() == 0) { - create(BlackAndWhiteListReq.builder() - .type(req.getType()) - .module(req.getModule()) - .param(param) - .build()); - } else if (detail.size() == 1) { - updateParamById(detail.get(0).getId(), param); - } else { - log.warn("指定唯一字段:{},不唯一记录:{}", req.getBusinessUniqueField(), JSONUtil.toJsonStr(detail)); - throw new ServiceException("请检查指定的【业务唯一字段名:" + req.getBusinessUniqueField() + "】是否正确,记录中存在不唯一值"); - } - }); + // 第一个分片,需要先删除所有对应模块的名单,再新增 + if (req.getFragment() == 1 ){ + deleteByModule(req.getType(),req.getModule()); + } + // 新增 + List collect = req.getParams().stream().map(param -> SaasBlackWhiteList.builder() + .type(req.getType().getValue()) + .module(req.getModule()) + .param(param) + .build()).collect(Collectors.toList()); + boolean saved = blackAndWhiteListRepository.saveBatch(collect); // 同步至登录黑名单 if (Objects.nonNull(req.getIsSyncLogin()) && req.getIsSyncLogin()){ internalSync(BlackAndWhiteListInternalSyncReq.builder() @@ -212,7 +200,7 @@ public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService { .sourceFields(Collections.singletonList(req.getSyncRegisterField())) .targetModule(BlackAndWhiteListConstant.OU_REGISTER_BLACK_LIST).build()); } - return true; + return saved; } /** From 96827fc2353161a7488f9d26abbcc4c7eb63a681 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Fri, 5 Jan 2024 16:19:25 +0800 Subject: [PATCH 11/12] =?UTF-8?q?feat(REQ-2040):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=92=8C=E6=9B=B4=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- black-list/black-list-service/pom.xml | 4 ++++ .../axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java | 2 +- .../server/dao/repository/BlackAndWhiteListRepository.java | 3 --- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/black-list/black-list-service/pom.xml b/black-list/black-list-service/pom.xml index 5cb4d37e..61d27631 100644 --- a/black-list/black-list-service/pom.xml +++ b/black-list/black-list-service/pom.xml @@ -37,5 +37,9 @@ org.springframework.cloud spring-cloud-context + + cn.axzo.pokonyan + pokonyan + diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java index bc200b3c..792b20f0 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/entity/SaasBlackWhiteList.java @@ -1,7 +1,7 @@ package cn.axzo.nanopart.server.dao.entity; -import cn.axzo.framework.data.mybatisplus.model.BaseEntity; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; diff --git a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java index 9e06f0e6..253e291e 100644 --- a/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java +++ b/black-list/black-list-service/src/main/java/cn/axzo/nanopart/server/dao/repository/BlackAndWhiteListRepository.java @@ -36,9 +36,6 @@ public class BlackAndWhiteListRepository extends ServiceImpl saasBlackWhiteList.setType(req1.getType().getValue())); - Date nowTime = new Date(System.currentTimeMillis()); - blackWhiteList.setCreateAt(nowTime); - blackWhiteList.setUpdateAt(nowTime); blackAndWhiteListMapper.insert(blackWhiteList); return blackWhiteList.getId(); } From 9248f47cf06d25477d612e20f9eeebb506758680 Mon Sep 17 00:00:00 2001 From: chenwenjian Date: Wed, 10 Jan 2024 14:01:38 +0800 Subject: [PATCH 12/12] =?UTF-8?q?feat(REQ-2040):=20nacos=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nanopart-server/src/main/resources/bootstrap.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nanopart-server/src/main/resources/bootstrap.yml b/nanopart-server/src/main/resources/bootstrap.yml index 214e168f..cbaf52b2 100644 --- a/nanopart-server/src/main/resources/bootstrap.yml +++ b/nanopart-server/src/main/resources/bootstrap.yml @@ -6,10 +6,10 @@ spring: config: server-addr: ${NACOS_HOST:https://dev-nacos.axzo.cn}:${NACOS_PORT:443} file-extension: yaml - namespace: ${NACOS_NAMESPACE_ID:f3c0f0d2-bac4-4498-bee7-9c3636b3afdf} + namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7} prefix: ${spring.application.name} profiles: - active: ${NACOS_PROFILES_ACTIVE:test} + active: ${NACOS_PROFILES_ACTIVE:dev} include: swagger main: allow-bean-definition-overriding: true