From af08632c37b10c0927cf3fb9c75fac0d3a58b9f1 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 10 七月 2023 18:20:05 +0800 Subject: [PATCH] add 新增 请求加密传输 合并优化 !pr377 --- /dev/null | 1 ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 2 ruoyi-admin/pom.xml | 7 -- ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java | 31 +++------ ruoyi-common/ruoyi-common-bom/pom.xml | 6 -- ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java | 48 ++++++++++++++++ ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java | 4 ruoyi-admin/src/main/resources/application.yml | 6 +- ruoyi-common/pom.xml | 1 ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java | 32 ++++++++++ 10 files changed, 98 insertions(+), 40 deletions(-) diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 3d121c0..8193359 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -87,13 +87,6 @@ <artifactId>JustAuth</artifactId> </dependency> - <!-- 鎺ュ彛璇锋眰鍙傛暟鍔犲瘑妯″潡 --> - <dependency> - <groupId>org.dromara</groupId> - <artifactId>ruoyi-common-cryptapi</artifactId> - </dependency> - - <!-- skywalking 鏁村悎 logback --> <!-- <dependency>--> <!-- <groupId>org.apache.skywalking</groupId>--> diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 878a9c3..03ca7ea 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -176,10 +176,10 @@ # api鎺ュ彛鍔犲瘑 api-decrypt: # 鏄惁寮�鍚叏灞�鎺ュ彛鍔犲瘑 - enable: false + enabled: true # AES 鍔犲瘑澶存爣璇� - headerFlag: AES - # 鍏閽� 闈炲绉扮畻娉曠殑鍏閽� 濡傦細SM2锛孯SA + headerFlag: encrypt-key + # 鍏閽� 闈炲绉扮畻娉曠殑鍏閽� 濡傦細SM2锛孯SA 浣跨敤鑰呰鑷鏇存崲 publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ== privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y= diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index e77ea23..45493d3 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -33,7 +33,6 @@ <module>ruoyi-common-encrypt</module> <module>ruoyi-common-tenant</module> <module>ruoyi-common-websocket</module> - <module>ruoyi-common-cryptapi</module> </modules> <artifactId>ruoyi-common</artifactId> diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 5014954..ef8afda 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -172,12 +172,6 @@ <version>${revision}</version> </dependency> - <!-- 鎺ュ彛璇锋眰鍙傛暟鍔犲瘑妯″潡 --> - <dependency> - <groupId>org.dromara</groupId> - <artifactId>ruoyi-common-cryptapi</artifactId> - <version>${revision}</version> - </dependency> </dependencies> </dependencyManagement> diff --git a/ruoyi-common/ruoyi-common-cryptapi/pom.xml b/ruoyi-common/ruoyi-common-cryptapi/pom.xml deleted file mode 100644 index ee0c577..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <parent> - <groupId>org.dromara</groupId> - <artifactId>ruoyi-common</artifactId> - <version>${revision}</version> - </parent> - <modelVersion>4.0.0</modelVersion> - - <artifactId>ruoyi-common-cryptapi</artifactId> - - <description> - ruoyi-common-cryptapi 鎺ュ彛璇锋眰鍙傛暟鍔犲瘑妯″潡 - </description> - - <dependencies> - - <dependency> - <groupId>org.dromara</groupId> - <artifactId>ruoyi-common-core</artifactId> - </dependency> - <dependency> - <groupId>cn.hutool</groupId> - <artifactId>hutool-crypto</artifactId> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-webmvc</artifactId> - </dependency> - </dependencies> - -</project> diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/annotation/ApiDecrypt.java b/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/annotation/ApiDecrypt.java deleted file mode 100644 index 2e2bdee..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/annotation/ApiDecrypt.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.cryptapi.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 褰撴爣鏈夊綋鍓嶆敞瑙g殑鎺ュ彛锛屾帴鍙g┛鍙備负鍔犲瘑瀛楃涓诧紝杩涜瑙e瘑鍚庝负dto瀵硅薄锛� 涓嶅奖鍝嶅悗缁弬鏁版牎楠屻�� - * @author wdhcr - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface ApiDecrypt { -} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/config/ApiDecryptConfig.java b/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/config/ApiDecryptConfig.java deleted file mode 100644 index c74339b..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/config/ApiDecryptConfig.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.dromara.cryptapi.config; - -import cn.hutool.core.collection.CollectionUtil; -import jakarta.servlet.DispatcherType; -import lombok.RequiredArgsConstructor; -import org.dromara.cryptapi.filter.CryptoFilter; -import org.dromara.cryptapi.handler.DecryptUrlHandler; -import org.dromara.cryptapi.properties.ApiDecryptProperties; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; - -import java.util.HashMap; -import java.util.List; - -@AutoConfiguration -@RequiredArgsConstructor -@EnableConfigurationProperties(ApiDecryptProperties.class) -public class ApiDecryptConfig { - - private final DecryptUrlHandler decryptUrlHandler; - - private final ApiDecryptProperties apiDecryptProperties; - - @Bean - public FilterRegistrationBean<CryptoFilter> cryptoFilterRegistration() { - FilterRegistrationBean<CryptoFilter> registration = new FilterRegistrationBean<>(); - registration.setDispatcherTypes(DispatcherType.REQUEST); - registration.setFilter(new CryptoFilter()); - List<String> urls = decryptUrlHandler.getUrls(); - if (CollectionUtil.isNotEmpty(urls) || apiDecryptProperties.getEnable()) { - registration.setEnabled(true); - registration.addUrlPatterns(urls.toArray(new String[0])); - } else { - registration.setEnabled(false); - } - registration.setName("cryptoFilter"); - HashMap<String, String> param = new HashMap<>(); - param.put(CryptoFilter.CRYPTO_PUBLIC_KEY, apiDecryptProperties.getPublicKey()); - param.put(CryptoFilter.CRYPTO_PRIVATE_KEY, apiDecryptProperties.getPrivateKey()); - param.put(CryptoFilter.CRYPTO_HEADER_FLAG, apiDecryptProperties.getHeaderFlag()); - registration.setInitParameters(param); - registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); - return registration; - } -} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/AesEncryptor.java b/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/AesEncryptor.java deleted file mode 100644 index 29b4f4b..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/AesEncryptor.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.dromara.cryptapi.core; - -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.symmetric.AES; -import org.dromara.cryptapi.enums.EncodeType; - -import java.nio.charset.StandardCharsets; - -/** - * AES绠楁硶瀹炵幇 - * - * @author 鑰侀┈ - * @version 4.6.0 - */ -public class AesEncryptor { - - private final AES aes; - - public AesEncryptor(EncryptContext context) { - String password = context.getPassword(); - if (StrUtil.isBlank(password)) { - throw new IllegalArgumentException("AES娌℃湁鑾峰緱绉橀挜淇℃伅"); - } - // aes绠楁硶鐨勭閽ヨ姹傛槸16浣嶃��24浣嶃��32浣� - int[] array = {16, 24, 32}; - if (!ArrayUtil.contains(array, password.length())) { - throw new IllegalArgumentException("AES绉橀挜闀垮害搴旇涓�16浣嶃��24浣嶃��32浣嶏紝瀹為檯涓�" + password.length() + "浣�"); - } - aes = SecureUtil.aes(context.getPassword().getBytes(StandardCharsets.UTF_8)); - } - - - /** - * 鍔犲瘑 - * - * @param value 寰呭姞瀵嗗瓧绗︿覆 - * @param encodeType 鍔犲瘑鍚庣殑缂栫爜鏍煎紡 - */ - public String encrypt(String value, EncodeType encodeType) { - if (encodeType == EncodeType.HEX) { - return aes.encryptHex(value); - } else { - return aes.encryptBase64(value); - } - } - - /** - * 瑙e瘑 - * - * @param value 寰呭姞瀵嗗瓧绗︿覆 - */ - public String decrypt(String value) { - return this.aes.decryptStr(value); - } -} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/EncryptContext.java b/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/EncryptContext.java deleted file mode 100644 index 76804ad..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/EncryptContext.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.dromara.cryptapi.core; - -import lombok.Data; -import org.dromara.cryptapi.enums.EncodeType; - -/** - * 鍔犲瘑涓婁笅鏂� 鐢ㄤ簬encryptor浼犻�掑繀瑕佺殑鍙傛暟銆� - * - * @author 鑰侀┈ - * @version 4.6.0 - */ -@Data -public class EncryptContext { - - /** - * 瀹夊叏绉橀挜 - */ - private String password; - - /** - * 鍏挜 - */ - private String publicKey; - - /** - * 绉侀挜 - */ - private String privateKey; - - /** - * 缂栫爜鏂瑰紡锛宐ase64/hex - */ - private EncodeType encode; - -} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/RsaEncryptor.java b/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/RsaEncryptor.java deleted file mode 100644 index 9f8806d..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/core/RsaEncryptor.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.dromara.cryptapi.core; - -import cn.hutool.core.codec.Base64; -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.asymmetric.KeyType; -import cn.hutool.crypto.asymmetric.RSA; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.cryptapi.enums.EncodeType; - - -/** - * RSA绠楁硶瀹炵幇 - * - * @author 鑰侀┈ - * @version 4.6.0 - */ -public class RsaEncryptor { - - private final RSA rsa; - - public RsaEncryptor(EncryptContext context) { - String privateKey = context.getPrivateKey(); - String publicKey = context.getPublicKey(); - if (StringUtils.isAnyEmpty(privateKey, publicKey)) { - throw new IllegalArgumentException("RSA鍏閽ュ潎闇�瑕佹彁渚涳紝鍏挜鍔犲瘑锛岀閽ヨВ瀵嗐��"); - } - this.rsa = SecureUtil.rsa(Base64.decode(privateKey), Base64.decode(publicKey)); - } - - /** - * 鍔犲瘑 - * - * @param value 寰呭姞瀵嗗瓧绗︿覆 - * @param encodeType 鍔犲瘑鍚庣殑缂栫爜鏍煎紡 - */ - public String encrypt(String value, EncodeType encodeType) { - if (encodeType == EncodeType.HEX) { - return rsa.encryptHex(value, KeyType.PublicKey); - } else { - return rsa.encryptBase64(value, KeyType.PublicKey); - } - } - - /** - * 瑙e瘑 - * - * @param value 寰呭姞瀵嗗瓧绗︿覆 - */ - public String decrypt(String value) { - return this.rsa.decryptStr(value, KeyType.PrivateKey); - } -} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/enums/EncodeType.java b/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/enums/EncodeType.java deleted file mode 100644 index 7ee356a..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/enums/EncodeType.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dromara.cryptapi.enums; - -public enum EncodeType { - /** - * base64缂栫爜 - */ - BASE64, - - /** - * 16杩涘埗缂栫爜 - */ - HEX -} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/filter/CryptoFilter.java b/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/filter/CryptoFilter.java deleted file mode 100644 index b96e74d..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/filter/CryptoFilter.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.dromara.cryptapi.filter; - -import jakarta.servlet.*; -import jakarta.servlet.http.HttpServletRequest; -import lombok.SneakyThrows; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.cryptapi.core.EncryptContext; -import org.dromara.cryptapi.core.RsaEncryptor; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; - -import java.util.Objects; - - -/** - * Crypto 杩囨护鍣� - * - * @author wdhcr - */ -public class CryptoFilter implements Filter { - - public static final String CRYPTO_PUBLIC_KEY = "publicKey"; - public static final String CRYPTO_PRIVATE_KEY = "privateKey"; - public static final String CRYPTO_HEADER_FLAG = "headerFlag"; - private RsaEncryptor rsaEncryptor; - private String headerFlag; - - - @Override - public void init(FilterConfig filterConfig) { - EncryptContext encryptContext = new EncryptContext(); - encryptContext.setPublicKey(filterConfig.getInitParameter(CryptoFilter.CRYPTO_PUBLIC_KEY)); - encryptContext.setPrivateKey(filterConfig.getInitParameter(CryptoFilter.CRYPTO_PRIVATE_KEY)); - headerFlag = filterConfig.getInitParameter(CryptoFilter.CRYPTO_HEADER_FLAG); - rsaEncryptor = new RsaEncryptor(encryptContext); - } - - @SneakyThrows - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { - ServletRequest requestWrapper = null; - HttpServletRequest httpServletRequest = (HttpServletRequest) request; - if (StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE) - && (HttpMethod.PUT.matches(httpServletRequest.getMethod()) || HttpMethod.POST.matches(httpServletRequest.getMethod()))) { - requestWrapper = new DecryptRequestBodyWrapper(httpServletRequest, rsaEncryptor, headerFlag); - } - chain.doFilter(Objects.requireNonNullElse(requestWrapper, request), response); - } - - @Override - public void destroy() { - - } -} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/handler/DecryptUrlHandler.java b/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/handler/DecryptUrlHandler.java deleted file mode 100644 index cf01ea7..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/handler/DecryptUrlHandler.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.dromara.cryptapi.handler; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ReUtil; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import org.dromara.cryptapi.annotation.ApiDecrypt; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import java.util.*; -import java.util.regex.Pattern; - -/** - * 鑾峰彇闇�瑕佽В瀵嗙殑Url閰嶇疆 - * - * @author wdhcr - */ -@Data -@Component -@RequiredArgsConstructor -public class DecryptUrlHandler implements InitializingBean { - - private static final Pattern PATTERN = Pattern.compile("\\{(.*?)}"); - - private List<String> urls = new ArrayList<>(); - - private final RequestMappingHandlerMapping requestMappingHandlerMapping; - - @Override - public void afterPropertiesSet() { - Set<String> set = new HashSet<>(); - Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods(); - List<RequestMappingInfo> requestMappingInfos = map.entrySet().stream().filter(item -> { - HandlerMethod method = item.getValue(); - ApiDecrypt decrypt = method.getMethodAnnotation(ApiDecrypt.class); - // 鏍囨湁瑙e瘑娉ㄨВ鐨勫苟涓旀槸post 鎴栬�卲ut 璇锋眰鐨刪andler - return decrypt != null && CollectionUtil.containsAny(item.getKey().getMethodsCondition().getMethods(), Arrays.asList(RequestMethod.PUT, RequestMethod.POST)); - }).map(Map.Entry::getKey).toList(); - requestMappingInfos.forEach(info -> { - // 鑾峰彇娉ㄨВ涓婅竟鐨� path 鏇夸唬 path variable 涓� * - Optional.ofNullable(info.getPathPatternsCondition()) - .map(PathPatternsRequestCondition::getPatterns) - .orElseGet(HashSet::new) - .forEach(url -> set.add(ReUtil.replaceAll(url.getPatternString(), PATTERN, "*"))); - }); - urls.addAll(set); - } - -} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-cryptapi/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 533d4be..0000000 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -org.dromara.cryptapi.config.ApiDecryptConfig diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java new file mode 100644 index 0000000..098f6bc --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/ApiDecryptAutoConfiguration.java @@ -0,0 +1,32 @@ +package org.dromara.common.encrypt.config; + +import jakarta.servlet.DispatcherType; +import org.dromara.common.encrypt.filter.CryptoFilter; +import org.dromara.common.encrypt.properties.ApiDecryptProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; + +/** + * api 瑙e瘑鑷姩閰嶇疆 + * + * @author wdhcr + */ +@AutoConfiguration +@EnableConfigurationProperties(ApiDecryptProperties.class) +@ConditionalOnProperty(value = "api-decrypt.enabled", havingValue = "true") +public class ApiDecryptAutoConfiguration { + + @Bean + public FilterRegistrationBean<CryptoFilter> cryptoFilterRegistration(ApiDecryptProperties properties) { + FilterRegistrationBean<CryptoFilter> registration = new FilterRegistrationBean<>(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new CryptoFilter(properties)); + registration.addUrlPatterns("/*"); + registration.setName("cryptoFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + return registration; + } +} diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java new file mode 100644 index 0000000..6d039bb --- /dev/null +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/CryptoFilter.java @@ -0,0 +1,48 @@ +package org.dromara.common.encrypt.filter; + +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.properties.ApiDecryptProperties; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; + +import java.io.IOException; +import java.util.Objects; + + +/** + * Crypto 杩囨护鍣� + * + * @author wdhcr + */ +public class CryptoFilter implements Filter { + private final ApiDecryptProperties properties; + + public CryptoFilter(ApiDecryptProperties properties) { + this.properties = properties; + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + ServletRequest requestWrapper = null; + HttpServletRequest servletRequest = (HttpServletRequest) request; + // 鏄惁涓� json 璇锋眰 + if (StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { + // 鏄惁涓� put 鎴栬�� post 璇锋眰 + if (HttpMethod.PUT.matches(servletRequest.getMethod()) || HttpMethod.POST.matches(servletRequest.getMethod())) { + // 鏄惁瀛樺湪鍔犲瘑鏍囧ご + String headerValue = servletRequest.getHeader(properties.getHeaderFlag()); + if (StringUtils.isNotBlank(headerValue)) { + requestWrapper = new DecryptRequestBodyWrapper(servletRequest, properties.getPublicKey(), properties.getPrivateKey(), properties.getHeaderFlag()); + } + } + } + chain.doFilter(Objects.requireNonNullElse(requestWrapper, request), response); + } + + @Override + public void destroy() { + + } +} diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/filter/DecryptRequestBodyWrapper.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java similarity index 65% rename from ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/filter/DecryptRequestBodyWrapper.java rename to ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java index 8d014c8..fa9a310 100644 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/filter/DecryptRequestBodyWrapper.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/DecryptRequestBodyWrapper.java @@ -1,18 +1,12 @@ -package org.dromara.cryptapi.filter; +package org.dromara.common.encrypt.filter; -import cn.hutool.core.codec.Base64; import cn.hutool.core.io.IoUtil; import jakarta.servlet.ReadListener; import jakarta.servlet.ServletInputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequestWrapper; import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.exception.base.BaseException; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.cryptapi.core.AesEncryptor; -import org.dromara.cryptapi.core.EncryptContext; -import org.dromara.cryptapi.core.RsaEncryptor; -import org.dromara.cryptapi.enums.EncodeType; +import org.dromara.common.encrypt.utils.EncryptUtils; import org.springframework.http.MediaType; import java.io.BufferedReader; @@ -30,21 +24,18 @@ private final byte[] body; - public DecryptRequestBodyWrapper(HttpServletRequest request, RsaEncryptor rsaEncryptor, String headerFlag) throws IOException { + public DecryptRequestBodyWrapper(HttpServletRequest request, String publicKey, String privateKey, String headerFlag) throws IOException { super(request); - String requestRsa = request.getHeader(headerFlag); - if (StringUtils.isEmpty(requestRsa)) { - throw new BaseException("鍔犲瘑AES鐨勫姩鎬佸瘑鐮佷笉鑳戒负绌�"); - } - String decryptAes = new String(Base64.decode(rsaEncryptor.decrypt(requestRsa))); + // 鑾峰彇 AES 瀵嗙爜 閲囩敤 RSA 鍔犲瘑 + String headerRsa = request.getHeader(headerFlag); + String decryptAes = EncryptUtils.decryptByRsa(headerRsa, privateKey); + // 瑙e瘑 AES 瀵嗙爜 + String aesPassword = EncryptUtils.decryptByBase64(decryptAes); request.setCharacterEncoding(Constants.UTF8); byte[] readBytes = IoUtil.readBytes(request.getInputStream(), false); - String requestBody = StringUtils.toEncodedString(readBytes, StandardCharsets.UTF_8); - EncryptContext encryptContext = new EncryptContext(); - encryptContext.setPassword(decryptAes); - encryptContext.setEncode(EncodeType.BASE64); - AesEncryptor aesEncryptor = new AesEncryptor(encryptContext); - String decryptBody = aesEncryptor.decrypt(requestBody); + String requestBody = new String(readBytes, StandardCharsets.UTF_8); + // 瑙e瘑 body 閲囩敤 AES 鍔犲瘑 + String decryptBody = EncryptUtils.decryptByAes(requestBody, aesPassword); body = decryptBody.getBytes(StandardCharsets.UTF_8); } diff --git a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/properties/ApiDecryptProperties.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java similarity index 85% rename from ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/properties/ApiDecryptProperties.java rename to ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java index f7dc6b0..9e25b7b 100644 --- a/ruoyi-common/ruoyi-common-cryptapi/src/main/java/org/dromara/cryptapi/properties/ApiDecryptProperties.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/ApiDecryptProperties.java @@ -1,4 +1,4 @@ -package org.dromara.cryptapi.properties; +package org.dromara.common.encrypt.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -14,7 +14,7 @@ /** * 鍔犲瘑寮�鍏� */ - private Boolean enable; + private Boolean enabled; /** * 澶撮儴鏍囪瘑 diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index fe37589..132cf29 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1,3 @@ org.dromara.common.encrypt.config.EncryptorAutoConfiguration +org.dromara.common.encrypt.config.ApiDecryptAutoConfiguration + -- Gitblit v1.9.3