From 111e7329673778c475c4ff4aa5ba6eef9f43f506 Mon Sep 17 00:00:00 2001 From: Charles7c Date: Fri, 9 Feb 2024 10:13:55 +0800 Subject: [PATCH] =?UTF-8?q?refactor(security/mask):=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=84=B1=E6=95=8F=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/mask/annotation/JsonMask.java | 9 +++++ .../mask/core/JsonMaskSerializer.java | 11 ++++-- .../starter/security/mask/enums/MaskType.java | 19 ++-------- .../security/mask/strategy/IMaskStrategy.java | 37 +++++++++++++++++++ 4 files changed, 58 insertions(+), 18 deletions(-) create mode 100644 continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/strategy/IMaskStrategy.java diff --git a/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/annotation/JsonMask.java b/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/annotation/JsonMask.java index 24769506..b13c7bf9 100644 --- a/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/annotation/JsonMask.java +++ b/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/annotation/JsonMask.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import top.charles7c.continew.starter.core.constant.StringConstants; import top.charles7c.continew.starter.security.mask.core.JsonMaskSerializer; import top.charles7c.continew.starter.security.mask.enums.MaskType; +import top.charles7c.continew.starter.security.mask.strategy.IMaskStrategy; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -44,6 +45,14 @@ public @interface JsonMask { */ MaskType value() default MaskType.CUSTOM; + /** + * 脱敏策略 + *

+ * 优先级高于脱敏类型 + *

+ */ + Class strategy() default IMaskStrategy.class; + /** * 左侧保留位数 *

diff --git a/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/core/JsonMaskSerializer.java b/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/core/JsonMaskSerializer.java index 94befdc5..d5b9da33 100644 --- a/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/core/JsonMaskSerializer.java +++ b/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/core/JsonMaskSerializer.java @@ -18,6 +18,7 @@ package top.charles7c.continew.starter.security.mask.core; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonMappingException; @@ -26,7 +27,7 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import top.charles7c.continew.starter.core.constant.StringConstants; import top.charles7c.continew.starter.security.mask.annotation.JsonMask; -import top.charles7c.continew.starter.security.mask.enums.MaskType; +import top.charles7c.continew.starter.security.mask.strategy.IMaskStrategy; import java.io.IOException; import java.util.Objects; @@ -56,8 +57,12 @@ public class JsonMaskSerializer extends JsonSerializer implements Contex jsonGenerator.writeString(StringConstants.EMPTY); return; } - MaskType maskType = jsonMask.value(); - jsonGenerator.writeString(maskType.mask(str, jsonMask.character(), jsonMask.left(), jsonMask.right())); + // 使用自定义脱敏策略 + Class strategyClass = jsonMask.strategy(); + IMaskStrategy maskStrategy = strategyClass != IMaskStrategy.class + ? SpringUtil.getBean(strategyClass) + : jsonMask.value(); + jsonGenerator.writeString(maskStrategy.mask(str, jsonMask.character(), jsonMask.left(), jsonMask.right())); } @Override diff --git a/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/enums/MaskType.java b/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/enums/MaskType.java index 220fa30b..54efa932 100644 --- a/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/enums/MaskType.java +++ b/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/enums/MaskType.java @@ -17,8 +17,8 @@ package top.charles7c.continew.starter.security.mask.enums; import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.CharUtil; import top.charles7c.continew.starter.core.constant.StringConstants; +import top.charles7c.continew.starter.security.mask.strategy.IMaskStrategy; /** * 脱敏类型 @@ -26,7 +26,7 @@ import top.charles7c.continew.starter.core.constant.StringConstants; * @author Charles7c * @since 1.4.0 */ -public enum MaskType { +public enum MaskType implements IMaskStrategy { /** * 自定义脱敏 @@ -119,11 +119,11 @@ public enum MaskType { buffer.append(cleanStr, 0, 4); for (int i = 0; i < midLength; ++i) { if (i % 4 == 0) { - buffer.append(CharUtil.SPACE); + buffer.append(StringConstants.SPACE); } buffer.append(character); } - buffer.append(CharUtil.SPACE).append(cleanStr, length - endLength, length); + buffer.append(StringConstants.SPACE).append(cleanStr, length - endLength, length); return buffer.toString(); } }, @@ -217,15 +217,4 @@ public enum MaskType { .format(":%s:%s:%s:%s:%s:%s:%s", character, character, character, character, character, character, character); } },; - - /** - * 数据脱敏 - * - * @param str 原始字符串 - * @param character 脱敏符号 - * @param left 左侧保留位数 - * @param right 右侧保留位数 - * @return 脱敏后的数据 - */ - public abstract String mask(String str, char character, int left, int right); } diff --git a/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/strategy/IMaskStrategy.java b/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/strategy/IMaskStrategy.java new file mode 100644 index 00000000..7134c816 --- /dev/null +++ b/continew-starter-security/continew-starter-security-mask/src/main/java/top/charles7c/continew/starter/security/mask/strategy/IMaskStrategy.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.continew.starter.security.mask.strategy; + +/** + * 脱敏策略 + * + * @author Charles7c + * @since 1.4.0 + */ +public interface IMaskStrategy { + + /** + * 数据脱敏 + * + * @param str 原始字符串 + * @param character 脱敏符号 + * @param left 左侧保留位数 + * @param right 右侧保留位数 + * @return 脱敏后的数据 + */ + String mask(String str, char character, int left, int right); +}