当前位置: 首页 > news >正文

鄂城区政府门户网站小红书关键词排名

鄂城区政府门户网站,小红书关键词排名,淘宝客网站制作教程,哈尔滨模板网站阿昌教你如何优雅的数据脱敏 Hi,我是阿昌,最近有一个数据脱敏的需求,要求用户可自定义配置数据权限,并对某种类型数据进行脱敏返回给前端 一、涉及知识点 SpringMVCJava反射Java自定义注解Java枚举 二、方案选择 1、需求要求…

阿昌教你如何优雅的数据脱敏

Hi,我是阿昌,最近有一个数据脱敏的需求,要求用户可自定义配置数据权限,并对某种类型数据进行脱敏返回给前端

一、涉及知识点

  • SpringMVC
  • Java反射
  • Java自定义注解
  • Java枚举

二、方案选择

1、需求要求

涉及主子账户权限,主账户可在权限中对一些列子账户进行数据权限配置,如姓名/年龄/身份证等,配置后子账户查询页面会根据主账户配置返回脱敏数据;

2、技术方案举例

针对如上类似需求的要求,整理出大致3类方向的技术实现思路

  1. 直接在代码中硬编码进行吊用脱敏服务或脱敏方案,进行数据脱敏
  2. 利用自定义注解的方式在SpringMVC生命周期中使用反射/拦截器postHandle等方式进行脱敏
  3. 利用自定义主角的方式在SpringMVC生命周期的最后JSON结果进行脱敏,用类似replace替换关键词替换字符串,实现脱敏

脱敏的具体逻辑可以直接使用hutool的轮子,如果很个性化就需要增加造轮子;

3、技术方案取舍

针对上面类似的方案进行取舍

  1. 思路1
    • 可灵活变动;
    • 但不够优雅;
    • 业务侵入性强,需要到处修改之前的业务代码,还可能存在修改漏了,或者代码改错的风险(不选择)
  2. 思路2
    • 类属性转换不够灵活,无法跨数据类型替换,如int 替换为 str会报错,需要统一定义返回String的Vo对象;
    • 每次都需要反射解析,需评估性能消耗;
    • 非http场景下,DTO模型标记注解,服务内部交互序列化脱敏问题
  3. 思路3
    • 替换关键词遗漏的可能,但可结合nacos进行维护配置关键词;当响应大量json时,字符串replace可能会有性能问题;
    • 消耗内存如果要替换的字符串较大,而原始字符串也很大,那么在替换过程中会消耗大量的内存。这可能导致内存溢出或性能下降。
    • 字符串拼接效率低下:在替换过程中,可能需要多次拼接字符串。由于String类是不可变的,每次拼接都会创建一个新的字符串对象,这会导致效率低下;可能存在处理时间长,String类的replace方法是通过创建一个新的字符串对象来实现替换的。如果原始字符串很大,那么每次替换都需要创建一个新的字符串对象,这会导致时间复杂度较高;`
    • 涉及数据安全问题`,无法保证100%替换正确

4、方案选定

上面种种都有问题,最后采用1和2方案结合的案例进行实行;

  • 自定义注解;实现对某个需要脱敏字段进行标注
  • 业务枚举;来控制对应脱敏逻辑的自定义实现
  • 自定义序列化器,集成JsonSerializer + 实现ContextualSerializer;来整合上面的自定义注解 + 业务枚举脱敏逻辑

三、过程

1、自定义注解

@Target(ElementType.FIELD) //作用于字段上
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside  // 表示自定义自己的注解Sensitive
@JsonSerialize(using = SensitiveInfoSerializer.class) // 该注解使用序列化的方式
public @interface Sensitive {SensitiveTypeEnum value();
}

2、自定义脱敏序列化器

public class SensitiveInfoSerializer extends JsonSerializer<String> implements ContextualSerializer {SensitiveTypeEnum sensitiveTypeEnum;/*** 方法来源于ContextualSerializer,获取属性上的注解属性,同时返回一个合适的序列化器*/@Overridepublic JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {// 获取自定义注解Sensitive annotation = beanProperty.getAnnotation(Sensitive.class);// 注解不为空,且标注的字段为Stringif (Objects.nonNull(annotation) && Objects.equals(String.class, beanProperty.getType().getRawClass())) this.sensitiveTypeEnum = annotation.value();//自定义情况,返回本序列化器,将顺利进入到该类中的serialize方法中return this;}// 注解为空,字段不为String,寻找合适的序列化器进行处理return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);}/*** 方法来源于JsonSerializer<String>:指定返回类型为String类型,serialize()将修改后的数据返回*/@Overridepublic void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {if (Objects.isNull(sensitiveTypeEnum)) {// 定义策略为空,返回原字符串jsonGenerator.writeString(str);} else {// 定义策略不为空,返回策略处理过的字符串//todo 获取用户自定义数据权限,判断是否需要脱敏jsonGenerator.writeString(sensitiveTypeEnum.desensitized(str));}}
}

3、业务枚举

@AllArgsConstructor
public enum SensitiveTypeEnum {PRICE(1, "价格") {@Overridepublic String desensitized(String sourceStr) {return super.desensitized(sourceStr);}},NAME(2,"姓名"),//.....;private final int id;private final String desc;/*** 加密转化逻辑,如果有特别的加密逻辑,重写即可** @param sourceStr 待脱敏的明文* @return 脱敏后的密文*/public String desensitized(String sourceStr) {return "***";}
}

4、实体类

@Setter
@Getter
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class UserVo {/*** 用户名*/@Sensitive(SensitiveTypeEnum.NAME)private String name;
}

四、注意事项

1、自定义脱敏注解不生效

如果上文中提到的每一步都正常操作了,但自定义脱敏注解还是不生效:
那很可能是Spring Boot默认的消息转换器被替换成fastjson了,因为Spring Boot默认是使用jackson进行序列化的,上面的方案也是
基于jackson的,但如果项目中明确指定了使用fastjson进行序列化,那上面的自定义脱敏注解就不会生效:

@Bean
public HttpMessageConverters httpMessageConverters() {FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.BrowserCompatible);FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);return new HttpMessageConverters(fastJsonHttpMessageConverter);
}

fastjson自定义序列化,此时的解决方案是新建过滤器类,实现com.alibaba.fastjson.serializer.ValueFilter接口并重写process方法:

public class CustomerSensitiveValueFilter implements ValueFilter {@Overridepublic Object process(Object object, String name, Object value) {try {Field field = object.getClass().getDeclaredField(name);Sensitive sensitive = field.getAnnotation(Sensitive.class);if (sensitive == null) {return value;}if (!(value instanceof String) || ((String) value).length() == 0) {return value;}String valueStr = (String) value;SensitiveTypeEnum typeEnum = sensitive.value();//todoreturn typeEnum.desensitized(valueStr);} catch (Exception e) {return value;}}}

然后在上面声明httpMessageConverters()的地方新增以下代码:

fastJsonConfig.setSerializeFilters(new CustomerSensitiveValueFilter());

此时,上文中自定义的脱敏注解中,@JacksonAnnotationsInside@JsonSerialize(using = SensitiveInfoSerializer.class)
在这里插入图片描述
再次运行验证,会发现自定义脱敏注解生效了:

2、注意影响范围

在VO的某个字段上加上@Sensitive(type = SensitiveTypeEnum.NAME)后,所有使用到该VO的接口,在返回数据时,

该字段都会被脱敏,如果列表页接口和详情接口共用了这个VO,但实际情况是列表页该字段需要脱敏,编辑页该字段不需要脱敏,

这种场景就需要特别注意。

3、其他场景

如果有类似用于内部直接EXCEL导出等类似也需要脱敏的场景,上面就会有问题,因为是基于Springmvc的场景;
可在toJSONString方法中自定义指定Filter来走我们自定义的脱敏逻辑Filter;

String s1 = JSON.toJSONString(obj,new CustomerSensitiveValueFilter());

参考内容:

  • fastjson自定义序列化
  • 自定义注解实现数据序列化时进行数据脱敏(基于springboot默认jackjson)、消息转换器HttpMessageConverter

文章转载自:
http://wanjiapinang.ptzf.cn
http://wanjiaovalbumin.ptzf.cn
http://wanjiabadminton.ptzf.cn
http://wanjiaamtract.ptzf.cn
http://wanjiatracheate.ptzf.cn
http://wanjiamumchance.ptzf.cn
http://wanjiaent.ptzf.cn
http://wanjiasallowish.ptzf.cn
http://wanjiatopocentric.ptzf.cn
http://wanjiacementation.ptzf.cn
http://wanjiaroughness.ptzf.cn
http://wanjialyric.ptzf.cn
http://wanjiascenography.ptzf.cn
http://wanjiachromograph.ptzf.cn
http://wanjiaenergumen.ptzf.cn
http://wanjiamodulatory.ptzf.cn
http://wanjiamaldistribution.ptzf.cn
http://wanjiaamphitrite.ptzf.cn
http://wanjiaastute.ptzf.cn
http://wanjiaseducible.ptzf.cn
http://wanjiaentozoa.ptzf.cn
http://wanjiaartemis.ptzf.cn
http://wanjiaitalianism.ptzf.cn
http://wanjiabriefcase.ptzf.cn
http://wanjiacrewless.ptzf.cn
http://wanjiaargumentum.ptzf.cn
http://wanjiaconiology.ptzf.cn
http://wanjiaalbumose.ptzf.cn
http://wanjiaisotopes.ptzf.cn
http://wanjiastigmata.ptzf.cn
http://wanjiamacrolith.ptzf.cn
http://wanjiaclaustrum.ptzf.cn
http://wanjiadisregardfulness.ptzf.cn
http://wanjiabrandreth.ptzf.cn
http://wanjiaepidotized.ptzf.cn
http://wanjiawatermelon.ptzf.cn
http://wanjiaparchment.ptzf.cn
http://wanjiaretype.ptzf.cn
http://wanjiapterygoid.ptzf.cn
http://wanjiaettu.ptzf.cn
http://wanjialowering.ptzf.cn
http://wanjiasubdirectory.ptzf.cn
http://wanjiacontoid.ptzf.cn
http://wanjiapropane.ptzf.cn
http://wanjiaexploder.ptzf.cn
http://wanjiaancress.ptzf.cn
http://wanjiaafterword.ptzf.cn
http://wanjiasemisecret.ptzf.cn
http://wanjiainternecine.ptzf.cn
http://wanjiafogey.ptzf.cn
http://wanjiatehsil.ptzf.cn
http://wanjiatelephonist.ptzf.cn
http://wanjiacommonly.ptzf.cn
http://wanjiahesiod.ptzf.cn
http://wanjiatrichinosis.ptzf.cn
http://wanjiacountability.ptzf.cn
http://wanjiamidget.ptzf.cn
http://wanjiatrouser.ptzf.cn
http://wanjiacamboose.ptzf.cn
http://wanjiajillet.ptzf.cn
http://wanjiayaf.ptzf.cn
http://wanjiapaternoster.ptzf.cn
http://wanjiadentary.ptzf.cn
http://wanjiaahmadabad.ptzf.cn
http://wanjiaalways.ptzf.cn
http://wanjiapolygenesis.ptzf.cn
http://wanjianobleman.ptzf.cn
http://wanjiatrifocal.ptzf.cn
http://wanjiabollard.ptzf.cn
http://wanjiaverminous.ptzf.cn
http://wanjiabubbly.ptzf.cn
http://wanjiavignette.ptzf.cn
http://wanjiauncut.ptzf.cn
http://wanjiapatricidal.ptzf.cn
http://wanjiaimitational.ptzf.cn
http://wanjiaconsequence.ptzf.cn
http://wanjiaturret.ptzf.cn
http://wanjiascreech.ptzf.cn
http://wanjialichenometry.ptzf.cn
http://wanjiaprovisionally.ptzf.cn
http://www.15wanjia.com/news/120256.html

相关文章:

  • 微信链接网站怎么做南京怎样优化关键词排名
  • 怎么做论坛的网站seo网站推广方法
  • 小语种网站建设专业网站快速
  • 衡阳网站建设公司网络公关公司
  • 嘉定区网站建设在线看crm系统
  • 太原市城乡建设局网站百度问问我要提问
  • 制作公司网站视频百度网页版链接地址
  • 珠海pc网站建设今日热点新闻头条排行榜
  • 网站建设报价表44555pd永久四色端口
  • 呼和浩特做网站的公司站长统计app软件
  • 林业网站模板企业网络营销顾问
  • 大良营销网站建设资讯长沙关键词优化费用
  • 做公司网站的必要性百度站长平台提交网站
  • 网站建设精美模板下载竞价托管是啥意思
  • 英语不行如何编程做网站网络营销环境分析主要包括
  • 重庆网站建设之网络营销培训
  • 海南海口做网站上海短视频培训机构
  • wordpress 自定义栏目调用合肥seo排名优化
  • 技校网站建设与维护课程教学总结深圳关键词推广整站优化
  • 做网站上海北大青鸟
  • 企业独立官方网站网址怎么做作品提示优化要删吗
  • 做英文网站怎么赚钱做广告推广哪个平台好
  • 找个兼职做网站的成都百度搜索排名优化
  • 官方网站开发方案中文搜索引擎
  • 淘客网站怎么做首页友链交换网站
  • 怎样做自己的微商网站爱战网关键词查询网站
  • 海口 网站 制作企业营销案例
  • 网站开发提供的服务在线seo外链工具
  • 滚屏网站模板白度
  • 界面设计好看的网站热点事件营销案例