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

湖北建设招标网 官方网站辽宁省营商环境建设局 网站

湖北建设招标网 官方网站,辽宁省营商环境建设局 网站,麦考林网上购物商城,上海市房地产官网阿昌教你如何优雅的数据脱敏 Hi#xff0c;我是阿昌#xff0c;最近有一个数据脱敏的需求#xff0c;要求用户可自定义配置数据权限#xff0c;并对某种类型数据进行脱敏返回给前端 一、涉及知识点 SpringMVCJava反射Java自定义注解Java枚举 二、方案选择 1、需求要求…阿昌教你如何优雅的数据脱敏 Hi我是阿昌最近有一个数据脱敏的需求要求用户可自定义配置数据权限并对某种类型数据进行脱敏返回给前端 一、涉及知识点 SpringMVCJava反射Java自定义注解Java枚举 二、方案选择 1、需求要求 涉及主子账户权限主账户可在权限中对一些列子账户进行数据权限配置如姓名/年龄/身份证等配置后子账户查询页面会根据主账户配置返回脱敏数据 2、技术方案举例 针对如上类似需求的要求整理出大致3类方向的技术实现思路 直接在代码中硬编码进行吊用脱敏服务或脱敏方案进行数据脱敏利用自定义注解的方式在SpringMVC生命周期中使用反射/拦截器postHandle等方式进行脱敏利用自定义主角的方式在SpringMVC生命周期的最后JSON结果进行脱敏用类似replace替换关键词替换字符串实现脱敏 脱敏的具体逻辑可以直接使用hutool的轮子如果很个性化就需要增加造轮子 3、技术方案取舍 针对上面类似的方案进行取舍 思路1 可灵活变动但不够优雅业务侵入性强需要到处修改之前的业务代码还可能存在修改漏了或者代码改错的风险不选择 思路2 类属性转换不够灵活无法跨数据类型替换如int 替换为 str会报错需要统一定义返回String的Vo对象;每次都需要反射解析需评估性能消耗;非http场景下DTO模型标记注解服务内部交互序列化脱敏问题 思路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 JsonSerializerString 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);}/*** 方法来源于JsonSerializerString指定返回类型为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://www.w-s-a.com/news/895568/

相关文章:

  • 食品科技学校网站模板花溪村镇建设银行网站
  • 图片渐隐 网站头部flash地方志网站建设自查报告
  • 深圳做商城网站视觉品牌网站建设
  • 永康电子商务网站建设弹幕网站怎么做
  • 百川网站企业做网站要注意哪些
  • 球迷类的网站如何做网站建设需要哪些素材
  • 请问有重庆有做网站吗电子政务系统网站建设的基本过程
  • 建设银行管方网站官网最新版cmsv6
  • 网站开发工程师需要会写什么深圳网站(建设信科网络)
  • 台州网站搭建网站建设需求计划
  • 网站app免费下载软件大全大连百度推广哪家好
  • 网站建设的面试要求iis做的网站手机怎么访问
  • 定州市住房保障和城乡建设局网站上海网站建设排行
  • 网站发帖百度收录网站改版后不收录
  • 昆明建设局网站号码网站开发 浏览器兼容性
  • 湖北专业网站建设大全室内设计联盟app下载
  • 网站建设的意义和作用江苏城市建设档案馆网站
  • 华为云速建站贴心的广州网站建设
  • 网页网站开发公司天津seo推广
  • 网站线框图用什么做共享门店新增礼品卡兑换模式
  • 互联网建站是什么seo服务公司上海
  • 象山县城乡建设局网站做网站客户要求分期
  • 什么是网络营销型网站手机网站 图标
  • 全国新农村建设网站外包和劳务派遣哪个好
  • 网站权限控制什么软件做网站描述
  • 建网络商城网站wordpress关于
  • 专业网站建设分类标准重庆网站开发哪家专业
  • 织梦的网站关键词如何自己搭建微信小程序
  • 怎么做基金公司网站韩都衣舍网站建设ppt
  • 外贸网站模板aspnet网站开发 视频