From e67fc5ebd40c92440e42f354d7fa9b370aa4b78a Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 24 Nov 2025 06:20:37 +0000 Subject: [PATCH] =?UTF-8?q?!789=20update=20=E5=A2=9E=E5=8A=A0=E8=84=B1?= =?UTF-8?q?=E6=95=8F=E5=B7=A5=E5=85=B7=E7=B1=BB=E6=94=AF=E6=8C=81=E7=81=B5?= =?UTF-8?q?=E6=B4=BB=E9=85=8D=E7=BD=AE=E5=8F=AF=E8=A7=81=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E5=92=8C=E6=8E=A9=E7=A0=81=E9=95=BF=E5=BA=A6=20*=20update=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=84=B1=E6=95=8F=E5=B7=A5=E5=85=B7=E7=B1=BB?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=81=B5=E6=B4=BB=E9=85=8D=E7=BD=AE=E5=8F=AF?= =?UTF-8?q?=E8=A7=81=E9=95=BF=E5=BA=A6=E5=92=8C=E6=8E=A9=E7=A0=81=E9=95=BF?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sensitive/core/SensitiveStrategy.java | 8 +++ .../sensitive/utils/DesensitizedUtils.java | 54 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/utils/DesensitizedUtils.java diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java index 087132ea3..02e8b1b8a 100644 --- a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/core/SensitiveStrategy.java @@ -3,6 +3,7 @@ package org.dromara.common.sensitive.core; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.DesensitizedUtil; import lombok.AllArgsConstructor; +import org.dromara.common.sensitive.utils.DesensitizedUtils; import java.util.function.Function; @@ -80,6 +81,13 @@ public enum SensitiveStrategy { */ FIRST_MASK(DesensitizedUtil::firstMask), + /** + * 通用字符串脱敏 + * 可配置前后可见长度和中间掩码长度 + * 默认示例:前4位可见,后4位可见,中间固定4个* + */ + STRING_MASK(s -> DesensitizedUtils.mask(s, 4, 4, 4)), + /** * 清空为"" */ diff --git a/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/utils/DesensitizedUtils.java b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/utils/DesensitizedUtils.java new file mode 100644 index 000000000..8f408b2fe --- /dev/null +++ b/ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/utils/DesensitizedUtils.java @@ -0,0 +1,54 @@ +package org.dromara.common.sensitive.utils; + +import cn.hutool.core.util.DesensitizedUtil; +import cn.hutool.core.util.StrUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * 脱敏工具类 + * + * @author AprilWind + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DesensitizedUtils extends DesensitizedUtil { + + /** + * 灵活脱敏方法 + * + * @param value 原始字符串 + * @param prefixVisible 前面可见长度 + * @param suffixVisible 后面可见长度 + * @param maskLength 中间掩码长度(固定显示多少 *,如果总长度不足则自动缩减) + * @return 脱敏后字符串 + */ + public static String mask(String value, int prefixVisible, int suffixVisible, int maskLength) { + if (StrUtil.isBlank(value)) { + return value; + } + + int len = value.length(); + + // 总长度小于等于前后可见长度 → 全部掩码 + if (len <= prefixVisible + suffixVisible) { + return StrUtil.repeat('*', len); + } + + // 可用长度 = 总长度 - 前后可见长度 + int available = len - prefixVisible - suffixVisible; + + // 中间掩码长度不能超过可用长度 + int actualMaskLength = Math.min(maskLength, available); + + // 剩余字符尽量显示在中间掩码旁 + int remaining = available - actualMaskLength; + String middleChars = remaining > 0 ? value.substring(prefixVisible, prefixVisible + remaining) : ""; + String middleMask = StrUtil.repeat('*', actualMaskLength); + + String prefix = value.substring(0, prefixVisible); + String suffix = value.substring(len - suffixVisible); + + return prefix + middleChars + middleMask + suffix; + } + +}