mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 10:37:41 +08:00 
			
		
		
		
	Merge pull request #605 from craftsman4j/dev-0712-sensitive
【优化】数据脱敏支持 Spring el 表达式,支持根据权限控制脱敏
This commit is contained in:
		| @ -3,11 +3,15 @@ package cn.iocoder.yudao.framework.common.util.spring; | |||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.hutool.core.map.MapUtil; | import cn.hutool.core.map.MapUtil; | ||||||
| import cn.hutool.core.util.ArrayUtil; | import cn.hutool.core.util.ArrayUtil; | ||||||
|  | import cn.hutool.core.util.StrUtil; | ||||||
| import org.aspectj.lang.JoinPoint; | import org.aspectj.lang.JoinPoint; | ||||||
| import org.aspectj.lang.reflect.MethodSignature; | import org.aspectj.lang.reflect.MethodSignature; | ||||||
|  | import org.springframework.beans.factory.BeanFactory; | ||||||
|  | import org.springframework.context.expression.BeanFactoryResolver; | ||||||
| import org.springframework.core.DefaultParameterNameDiscoverer; | import org.springframework.core.DefaultParameterNameDiscoverer; | ||||||
| import org.springframework.core.ParameterNameDiscoverer; | import org.springframework.core.ParameterNameDiscoverer; | ||||||
| import org.springframework.expression.EvaluationContext; | import org.springframework.expression.EvaluationContext; | ||||||
|  | import org.springframework.expression.Expression; | ||||||
| import org.springframework.expression.ExpressionParser; | import org.springframework.expression.ExpressionParser; | ||||||
| import org.springframework.expression.spel.standard.SpelExpressionParser; | import org.springframework.expression.spel.standard.SpelExpressionParser; | ||||||
| import org.springframework.expression.spel.support.StandardEvaluationContext; | import org.springframework.expression.spel.support.StandardEvaluationContext; | ||||||
| @ -86,4 +90,21 @@ public class SpringExpressionUtils { | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 从 Bean 工厂,解析 EL 表达式的结果 | ||||||
|  |      * | ||||||
|  |      * @param beanFactory      Bean 工程 | ||||||
|  |      * @param expressionString EL 表达式 | ||||||
|  |      * @return 执行界面 | ||||||
|  |      */ | ||||||
|  |     public static Object parseExpression(BeanFactory beanFactory, String expressionString) { | ||||||
|  |         if (StrUtil.isBlank(expressionString)) { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |         Expression expression = EXPRESSION_PARSER.parseExpression(expressionString); | ||||||
|  |         StandardEvaluationContext context = new StandardEvaluationContext(); | ||||||
|  |         context.setBeanResolver(new BeanFactoryResolver(beanFactory)); | ||||||
|  |         return expression.getValue(context); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -32,6 +32,11 @@ | |||||||
|             <artifactId>spring-boot-configuration-processor</artifactId> |             <artifactId>spring-boot-configuration-processor</artifactId> | ||||||
|             <optional>true</optional> |             <optional>true</optional> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.aspectj</groupId> | ||||||
|  |             <artifactId>aspectjweaver</artifactId> | ||||||
|  |             <scope>provided</scope> <!-- 解决工具类 SpringExpressionUtils 加载的时候访问不到 org.aspectj.lang.JoinPoint 问题 --> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>com.github.xiaoymin</groupId> |             <groupId>com.github.xiaoymin</groupId> | ||||||
|  | |||||||
| @ -33,4 +33,10 @@ public @interface EmailDesensitize { | |||||||
|      * 比如:example@gmail.com 脱敏之后为 e****@gmail.com |      * 比如:example@gmail.com 脱敏之后为 e****@gmail.com | ||||||
|      */ |      */ | ||||||
|     String replacer() default "$1****$2"; |     String replacer() default "$1****$2"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -35,4 +35,10 @@ public @interface RegexDesensitize { | |||||||
|      * 脱敏后字符串 ******456789 |      * 脱敏后字符串 ******456789 | ||||||
|      */ |      */ | ||||||
|     String replacer() default "******"; |     String replacer() default "******"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| package cn.iocoder.yudao.framework.desensitize.core.regex.handler; | package cn.iocoder.yudao.framework.desensitize.core.regex.handler; | ||||||
|  |  | ||||||
|  | import cn.hutool.extra.spring.SpringUtil; | ||||||
|  | import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; | ||||||
| import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; | import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; | ||||||
|  |  | ||||||
| import java.lang.annotation.Annotation; | import java.lang.annotation.Annotation; | ||||||
| @ -14,6 +16,10 @@ public abstract class AbstractRegexDesensitizationHandler<T extends Annotation> | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public String desensitize(String origin, T annotation) { |     public String desensitize(String origin, T annotation) { | ||||||
|  |         Object expressionResult = SpringExpressionUtils.parseExpression(SpringUtil.getApplicationContext(), getCondition(annotation)); | ||||||
|  |         if (expressionResult instanceof Boolean && (Boolean) expressionResult) { | ||||||
|  |             return origin; | ||||||
|  |         } | ||||||
|         String regex = getRegex(annotation); |         String regex = getRegex(annotation); | ||||||
|         String replacer = getReplacer(annotation); |         String replacer = getReplacer(annotation); | ||||||
|         return origin.replaceAll(regex, replacer); |         return origin.replaceAll(regex, replacer); | ||||||
| @ -35,4 +41,12 @@ public abstract class AbstractRegexDesensitizationHandler<T extends Annotation> | |||||||
|      */ |      */ | ||||||
|     abstract String getReplacer(T annotation); |     abstract String getReplacer(T annotation); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式 | ||||||
|  |      * | ||||||
|  |      * @param annotation 注解信息 | ||||||
|  |      * @return el 表达式 | ||||||
|  |      */ | ||||||
|  |     abstract String getCondition(T annotation); | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -18,4 +18,10 @@ public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitiza | |||||||
|     String getReplacer(RegexDesensitize annotation) { |     String getReplacer(RegexDesensitize annotation) { | ||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(RegexDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -19,4 +19,9 @@ public class EmailDesensitizationHandler extends AbstractRegexDesensitizationHan | |||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(EmailDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -37,4 +37,9 @@ public @interface BankCardDesensitize { | |||||||
|      */ |      */ | ||||||
|     String replacer() default "*"; |     String replacer() default "*"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -37,4 +37,9 @@ public @interface CarLicenseDesensitize { | |||||||
|      */ |      */ | ||||||
|     String replacer() default "*"; |     String replacer() default "*"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -37,4 +37,9 @@ public @interface ChineseNameDesensitize { | |||||||
|      */ |      */ | ||||||
|     String replacer() default "*"; |     String replacer() default "*"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -37,4 +37,9 @@ public @interface FixedPhoneDesensitize { | |||||||
|      */ |      */ | ||||||
|     String replacer() default "*"; |     String replacer() default "*"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -37,4 +37,9 @@ public @interface IdCardDesensitize { | |||||||
|      */ |      */ | ||||||
|     String replacer() default "*"; |     String replacer() default "*"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -37,4 +37,9 @@ public @interface MobileDesensitize { | |||||||
|      */ |      */ | ||||||
|     String replacer() default "*"; |     String replacer() default "*"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -39,4 +39,9 @@ public @interface PasswordDesensitize { | |||||||
|      */ |      */ | ||||||
|     String replacer() default "*"; |     String replacer() default "*"; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -40,4 +40,10 @@ public @interface SliderDesensitize { | |||||||
|      * 前缀保留长度 |      * 前缀保留长度 | ||||||
|      */ |      */ | ||||||
|     int prefixKeep() default 0; |     int prefixKeep() default 0; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式,当执行 condition 返回 true 的时候,跳过脱敏 | ||||||
|  |      */ | ||||||
|  |     String condition() default ""; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| package cn.iocoder.yudao.framework.desensitize.core.slider.handler; | package cn.iocoder.yudao.framework.desensitize.core.slider.handler; | ||||||
|  |  | ||||||
|  | import cn.hutool.extra.spring.SpringUtil; | ||||||
|  | import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; | ||||||
| import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; | import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler; | ||||||
|  |  | ||||||
| import java.lang.annotation.Annotation; | import java.lang.annotation.Annotation; | ||||||
| @ -14,6 +16,10 @@ public abstract class AbstractSliderDesensitizationHandler<T extends Annotation> | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public String desensitize(String origin, T annotation) { |     public String desensitize(String origin, T annotation) { | ||||||
|  |         Object expressionResult = SpringExpressionUtils.parseExpression(SpringUtil.getApplicationContext(), getCondition(annotation)); | ||||||
|  |         if (expressionResult instanceof Boolean && (Boolean) expressionResult) { | ||||||
|  |             return origin; | ||||||
|  |         } | ||||||
|         int prefixKeep = getPrefixKeep(annotation); |         int prefixKeep = getPrefixKeep(annotation); | ||||||
|         int suffixKeep = getSuffixKeep(annotation); |         int suffixKeep = getSuffixKeep(annotation); | ||||||
|         String replacer = getReplacer(annotation); |         String replacer = getReplacer(annotation); | ||||||
| @ -75,4 +81,12 @@ public abstract class AbstractSliderDesensitizationHandler<T extends Annotation> | |||||||
|      */ |      */ | ||||||
|     abstract String getReplacer(T annotation); |     abstract String getReplacer(T annotation); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * el 表达式 | ||||||
|  |      * | ||||||
|  |      * @param annotation 注解信息 | ||||||
|  |      * @return el 表达式 | ||||||
|  |      */ | ||||||
|  |     abstract String getCondition(T annotation); | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -24,4 +24,9 @@ public class BankCardDesensitization extends AbstractSliderDesensitizationHandle | |||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(BankCardDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -22,4 +22,10 @@ public class CarLicenseDesensitization extends AbstractSliderDesensitizationHand | |||||||
|     String getReplacer(CarLicenseDesensitize annotation) { |     String getReplacer(CarLicenseDesensitize annotation) { | ||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(CarLicenseDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -24,4 +24,9 @@ public class ChineseNameDesensitization extends AbstractSliderDesensitizationHan | |||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(ChineseNameDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -22,4 +22,10 @@ public class DefaultDesensitizationHandler extends AbstractSliderDesensitization | |||||||
|     String getReplacer(SliderDesensitize annotation) { |     String getReplacer(SliderDesensitize annotation) { | ||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(SliderDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -22,4 +22,10 @@ public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHand | |||||||
|     String getReplacer(FixedPhoneDesensitize annotation) { |     String getReplacer(FixedPhoneDesensitize annotation) { | ||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(FixedPhoneDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -22,4 +22,10 @@ public class IdCardDesensitization extends AbstractSliderDesensitizationHandler< | |||||||
|     String getReplacer(IdCardDesensitize annotation) { |     String getReplacer(IdCardDesensitize annotation) { | ||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(IdCardDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -23,4 +23,10 @@ public class MobileDesensitization extends AbstractSliderDesensitizationHandler< | |||||||
|     String getReplacer(MobileDesensitize annotation) { |     String getReplacer(MobileDesensitize annotation) { | ||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(MobileDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -22,4 +22,10 @@ public class PasswordDesensitization extends AbstractSliderDesensitizationHandle | |||||||
|     String getReplacer(PasswordDesensitize annotation) { |     String getReplacer(PasswordDesensitize annotation) { | ||||||
|         return annotation.replacer(); |         return annotation.replacer(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     String getCondition(PasswordDesensitize annotation) { | ||||||
|  |         return annotation.condition(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 芋道源码
					芋道源码