Commit 7ba3b123131bdd792bbca9e46e7a7497895e101e
1 parent
8c2b8ed8
【优化】数据脱敏支持 Spring el 表达式,支持根据权限控制脱敏
Showing
24 changed files
with
81 additions
and
87 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java
| ... | ... | @@ -4,9 +4,9 @@ import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.map.MapUtil; |
| 5 | 5 | import cn.hutool.core.util.ArrayUtil; |
| 6 | 6 | import cn.hutool.core.util.StrUtil; |
| 7 | +import cn.hutool.extra.spring.SpringUtil; | |
| 7 | 8 | import org.aspectj.lang.JoinPoint; |
| 8 | 9 | import org.aspectj.lang.reflect.MethodSignature; |
| 9 | -import org.springframework.beans.factory.BeanFactory; | |
| 10 | 10 | import org.springframework.context.expression.BeanFactoryResolver; |
| 11 | 11 | import org.springframework.core.DefaultParameterNameDiscoverer; |
| 12 | 12 | import org.springframework.core.ParameterNameDiscoverer; |
| ... | ... | @@ -93,17 +93,16 @@ public class SpringExpressionUtils { |
| 93 | 93 | /** |
| 94 | 94 | * 从 Bean 工厂,解析 EL 表达式的结果 |
| 95 | 95 | * |
| 96 | - * @param beanFactory Bean 工程 | |
| 97 | 96 | * @param expressionString EL 表达式 |
| 98 | 97 | * @return 执行界面 |
| 99 | 98 | */ |
| 100 | - public static Object parseExpression(BeanFactory beanFactory, String expressionString) { | |
| 99 | + public static Object parseExpression(String expressionString) { | |
| 101 | 100 | if (StrUtil.isBlank(expressionString)) { |
| 102 | 101 | return null; |
| 103 | 102 | } |
| 104 | 103 | Expression expression = EXPRESSION_PARSER.parseExpression(expressionString); |
| 105 | 104 | StandardEvaluationContext context = new StandardEvaluationContext(); |
| 106 | - context.setBeanResolver(new BeanFactoryResolver(beanFactory)); | |
| 105 | + context.setBeanResolver(new BeanFactoryResolver(SpringUtil.getApplicationContext())); | |
| 107 | 106 | return expression.getValue(context); |
| 108 | 107 | } |
| 109 | 108 | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/base/handler/DesensitizationHandler.java
| 1 | 1 | package cn.iocoder.yudao.framework.desensitize.core.base.handler; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.util.ReflectUtil; | |
| 4 | + | |
| 3 | 5 | import java.lang.annotation.Annotation; |
| 4 | 6 | |
| 5 | 7 | /** |
| ... | ... | @@ -18,4 +20,21 @@ public interface DesensitizationHandler<T extends Annotation> { |
| 18 | 20 | */ |
| 19 | 21 | String desensitize(String origin, T annotation); |
| 20 | 22 | |
| 23 | + /** | |
| 24 | + * 是否禁用脱敏的 Spring EL 表达式 | |
| 25 | + * | |
| 26 | + * 如果返回 true 则跳过脱敏 | |
| 27 | + * | |
| 28 | + * @param annotation 注解信息 | |
| 29 | + * @return 是否禁用脱敏的 Spring EL 表达式 | |
| 30 | + */ | |
| 31 | + default String getDisable(T annotation) { | |
| 32 | + // 约定:默认就是 enable() 属性。如果不符合,子类重写 | |
| 33 | + try { | |
| 34 | + return (String) ReflectUtil.invoke(annotation, "disable"); | |
| 35 | + } catch (Exception ex) { | |
| 36 | + return ""; | |
| 37 | + } | |
| 38 | + } | |
| 39 | + | |
| 21 | 40 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/annotation/EmailDesensitize.java
| ... | ... | @@ -35,8 +35,10 @@ public @interface EmailDesensitize { |
| 35 | 35 | String replacer() default "$1****$2"; |
| 36 | 36 | |
| 37 | 37 | /** |
| 38 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 38 | + * 是否禁用脱敏 | |
| 39 | + * | |
| 40 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 39 | 41 | */ |
| 40 | - String condition() default ""; | |
| 42 | + String disable() default ""; | |
| 41 | 43 | |
| 42 | 44 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/annotation/RegexDesensitize.java
| ... | ... | @@ -37,8 +37,10 @@ public @interface RegexDesensitize { |
| 37 | 37 | String replacer() default "******"; |
| 38 | 38 | |
| 39 | 39 | /** |
| 40 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 40 | + * 是否禁用脱敏 | |
| 41 | + * | |
| 42 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 41 | 43 | */ |
| 42 | - String condition() default ""; | |
| 44 | + String disable() default ""; | |
| 43 | 45 | |
| 44 | 46 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java
| 1 | 1 | package cn.iocoder.yudao.framework.desensitize.core.regex.handler; |
| 2 | 2 | |
| 3 | -import cn.hutool.extra.spring.SpringUtil; | |
| 4 | 3 | import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; |
| 5 | 4 | import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; |
| 6 | 5 | |
| ... | ... | @@ -16,10 +15,13 @@ public abstract class AbstractRegexDesensitizationHandler<T extends Annotation> |
| 16 | 15 | |
| 17 | 16 | @Override |
| 18 | 17 | public String desensitize(String origin, T annotation) { |
| 19 | - Object expressionResult = SpringExpressionUtils.parseExpression(SpringUtil.getApplicationContext(), getCondition(annotation)); | |
| 20 | - if (expressionResult instanceof Boolean && (Boolean) expressionResult) { | |
| 18 | + // 1. 判断是否禁用脱敏 | |
| 19 | + Object disable = SpringExpressionUtils.parseExpression(getDisable(annotation)); | |
| 20 | + if (Boolean.TRUE.equals(disable)) { | |
| 21 | 21 | return origin; |
| 22 | 22 | } |
| 23 | + | |
| 24 | + // 2. 执行脱敏 | |
| 23 | 25 | String regex = getRegex(annotation); |
| 24 | 26 | String replacer = getReplacer(annotation); |
| 25 | 27 | return origin.replaceAll(regex, replacer); |
| ... | ... | @@ -41,12 +43,4 @@ public abstract class AbstractRegexDesensitizationHandler<T extends Annotation> |
| 41 | 43 | */ |
| 42 | 44 | abstract String getReplacer(T annotation); |
| 43 | 45 | |
| 44 | - /** | |
| 45 | - * el 表达式 | |
| 46 | - * | |
| 47 | - * @param annotation 注解信息 | |
| 48 | - * @return el 表达式 | |
| 49 | - */ | |
| 50 | - abstract String getCondition(T annotation); | |
| 51 | - | |
| 52 | 46 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java
| ... | ... | @@ -20,8 +20,8 @@ public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitiza |
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | @Override |
| 23 | - String getCondition(RegexDesensitize annotation) { | |
| 24 | - return annotation.condition(); | |
| 23 | + public String getDisable(RegexDesensitize annotation) { | |
| 24 | + return annotation.disable(); | |
| 25 | 25 | } |
| 26 | 26 | |
| 27 | 27 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/BankCardDesensitize.java
| ... | ... | @@ -38,8 +38,10 @@ public @interface BankCardDesensitize { |
| 38 | 38 | String replacer() default "*"; |
| 39 | 39 | |
| 40 | 40 | /** |
| 41 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 41 | + * 是否禁用脱敏 | |
| 42 | + * | |
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 42 | 44 | */ |
| 43 | - String condition() default ""; | |
| 45 | + String disable() default ""; | |
| 44 | 46 | |
| 45 | 47 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java
| ... | ... | @@ -38,8 +38,10 @@ public @interface CarLicenseDesensitize { |
| 38 | 38 | String replacer() default "*"; |
| 39 | 39 | |
| 40 | 40 | /** |
| 41 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 41 | + * 是否禁用脱敏 | |
| 42 | + * | |
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 42 | 44 | */ |
| 43 | - String condition() default ""; | |
| 45 | + String disable() default ""; | |
| 44 | 46 | |
| 45 | 47 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java
| ... | ... | @@ -38,8 +38,10 @@ public @interface ChineseNameDesensitize { |
| 38 | 38 | String replacer() default "*"; |
| 39 | 39 | |
| 40 | 40 | /** |
| 41 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 41 | + * 是否禁用脱敏 | |
| 42 | + * | |
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 42 | 44 | */ |
| 43 | - String condition() default ""; | |
| 45 | + String disable() default ""; | |
| 44 | 46 | |
| 45 | 47 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java
| ... | ... | @@ -38,8 +38,10 @@ public @interface FixedPhoneDesensitize { |
| 38 | 38 | String replacer() default "*"; |
| 39 | 39 | |
| 40 | 40 | /** |
| 41 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 41 | + * 是否禁用脱敏 | |
| 42 | + * | |
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 42 | 44 | */ |
| 43 | - String condition() default ""; | |
| 45 | + String disable() default ""; | |
| 44 | 46 | |
| 45 | 47 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/IdCardDesensitize.java
| ... | ... | @@ -38,8 +38,10 @@ public @interface IdCardDesensitize { |
| 38 | 38 | String replacer() default "*"; |
| 39 | 39 | |
| 40 | 40 | /** |
| 41 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 41 | + * 是否禁用脱敏 | |
| 42 | + * | |
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 42 | 44 | */ |
| 43 | - String condition() default ""; | |
| 45 | + String disable() default ""; | |
| 44 | 46 | |
| 45 | 47 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/MobileDesensitize.java
| ... | ... | @@ -38,8 +38,10 @@ public @interface MobileDesensitize { |
| 38 | 38 | String replacer() default "*"; |
| 39 | 39 | |
| 40 | 40 | /** |
| 41 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 41 | + * 是否禁用脱敏 | |
| 42 | + * | |
| 43 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 42 | 44 | */ |
| 43 | - String condition() default ""; | |
| 45 | + String disable() default ""; | |
| 44 | 46 | |
| 45 | 47 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/PasswordDesensitize.java
| ... | ... | @@ -40,8 +40,10 @@ public @interface PasswordDesensitize { |
| 40 | 40 | String replacer() default "*"; |
| 41 | 41 | |
| 42 | 42 | /** |
| 43 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 43 | + * 是否禁用脱敏 | |
| 44 | + * | |
| 45 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 44 | 46 | */ |
| 45 | - String condition() default ""; | |
| 47 | + String disable() default ""; | |
| 46 | 48 | |
| 47 | 49 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/annotation/SliderDesensitize.java
| ... | ... | @@ -42,8 +42,10 @@ public @interface SliderDesensitize { |
| 42 | 42 | int prefixKeep() default 0; |
| 43 | 43 | |
| 44 | 44 | /** |
| 45 | - * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | |
| 45 | + * 是否禁用脱敏 | |
| 46 | + * | |
| 47 | + * 支持 Spring EL 表达式,如果返回 true 则跳过脱敏 | |
| 46 | 48 | */ |
| 47 | - String condition() default ""; | |
| 49 | + String disable() default ""; | |
| 48 | 50 | |
| 49 | 51 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java
| 1 | 1 | package cn.iocoder.yudao.framework.desensitize.core.slider.handler; |
| 2 | 2 | |
| 3 | -import cn.hutool.extra.spring.SpringUtil; | |
| 4 | 3 | import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; |
| 5 | 4 | import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; |
| 6 | 5 | |
| ... | ... | @@ -16,10 +15,13 @@ public abstract class AbstractSliderDesensitizationHandler<T extends Annotation> |
| 16 | 15 | |
| 17 | 16 | @Override |
| 18 | 17 | public String desensitize(String origin, T annotation) { |
| 19 | - Object expressionResult = SpringExpressionUtils.parseExpression(SpringUtil.getApplicationContext(), getCondition(annotation)); | |
| 20 | - if (expressionResult instanceof Boolean && (Boolean) expressionResult) { | |
| 18 | + // 1. 判断是否禁用脱敏 | |
| 19 | + Object disable = SpringExpressionUtils.parseExpression(getDisable(annotation)); | |
| 20 | + if (Boolean.FALSE.equals(disable)) { | |
| 21 | 21 | return origin; |
| 22 | 22 | } |
| 23 | + | |
| 24 | + // 2. 执行脱敏 | |
| 23 | 25 | int prefixKeep = getPrefixKeep(annotation); |
| 24 | 26 | int suffixKeep = getSuffixKeep(annotation); |
| 25 | 27 | String replacer = getReplacer(annotation); |
| ... | ... | @@ -81,12 +83,4 @@ public abstract class AbstractSliderDesensitizationHandler<T extends Annotation> |
| 81 | 83 | */ |
| 82 | 84 | abstract String getReplacer(T annotation); |
| 83 | 85 | |
| 84 | - /** | |
| 85 | - * el 表达式 | |
| 86 | - * | |
| 87 | - * @param annotation 注解信息 | |
| 88 | - * @return el 表达式 | |
| 89 | - */ | |
| 90 | - abstract String getCondition(T annotation); | |
| 91 | - | |
| 92 | 86 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/BankCardDesensitization.java
| ... | ... | @@ -25,8 +25,8 @@ public class BankCardDesensitization extends AbstractSliderDesensitizationHandle |
| 25 | 25 | } |
| 26 | 26 | |
| 27 | 27 | @Override |
| 28 | - String getCondition(BankCardDesensitize annotation) { | |
| 29 | - return annotation.condition(); | |
| 28 | + public String getDisable(BankCardDesensitize annotation) { | |
| 29 | + return ""; | |
| 30 | 30 | } |
| 31 | 31 | |
| 32 | 32 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java
| ... | ... | @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.CarLicenseD |
| 8 | 8 | * @author gaibu |
| 9 | 9 | */ |
| 10 | 10 | public class CarLicenseDesensitization extends AbstractSliderDesensitizationHandler<CarLicenseDesensitize> { |
| 11 | + | |
| 11 | 12 | @Override |
| 12 | 13 | Integer getPrefixKeep(CarLicenseDesensitize annotation) { |
| 13 | 14 | return annotation.prefixKeep(); |
| ... | ... | @@ -24,8 +25,8 @@ public class CarLicenseDesensitization extends AbstractSliderDesensitizationHand |
| 24 | 25 | } |
| 25 | 26 | |
| 26 | 27 | @Override |
| 27 | - String getCondition(CarLicenseDesensitize annotation) { | |
| 28 | - return annotation.condition(); | |
| 28 | + public String getDisable(CarLicenseDesensitize annotation) { | |
| 29 | + return annotation.disable(); | |
| 29 | 30 | } |
| 30 | 31 | |
| 31 | 32 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java
| ... | ... | @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.SliderDesen |
| 8 | 8 | * @author gaibu |
| 9 | 9 | */ |
| 10 | 10 | public class DefaultDesensitizationHandler extends AbstractSliderDesensitizationHandler<SliderDesensitize> { |
| 11 | + | |
| 11 | 12 | @Override |
| 12 | 13 | Integer getPrefixKeep(SliderDesensitize annotation) { |
| 13 | 14 | return annotation.prefixKeep(); |
| ... | ... | @@ -23,9 +24,4 @@ public class DefaultDesensitizationHandler extends AbstractSliderDesensitization |
| 23 | 24 | return annotation.replacer(); |
| 24 | 25 | } |
| 25 | 26 | |
| 26 | - @Override | |
| 27 | - String getCondition(SliderDesensitize annotation) { | |
| 28 | - return annotation.condition(); | |
| 29 | - } | |
| 30 | - | |
| 31 | 27 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java
| ... | ... | @@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.FixedPhoneD |
| 8 | 8 | * @author gaibu |
| 9 | 9 | */ |
| 10 | 10 | public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHandler<FixedPhoneDesensitize> { |
| 11 | + | |
| 11 | 12 | @Override |
| 12 | 13 | Integer getPrefixKeep(FixedPhoneDesensitize annotation) { |
| 13 | 14 | return annotation.prefixKeep(); |
| ... | ... | @@ -23,9 +24,4 @@ public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHand |
| 23 | 24 | return annotation.replacer(); |
| 24 | 25 | } |
| 25 | 26 | |
| 26 | - @Override | |
| 27 | - String getCondition(FixedPhoneDesensitize annotation) { | |
| 28 | - return annotation.condition(); | |
| 29 | - } | |
| 30 | - | |
| 31 | 27 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/IdCardDesensitization.java
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/MobileDesensitization.java
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/PasswordDesensitization.java