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

springboot 之 接口数据脱敏

实际开发中,可能会遇到需要将接口返回数据进行脱敏,这里记录下如何操作。

这里默认使用的是springboot自带的Jackson库

定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {/*** 脱敏策略*/SensitiveStrategy strategy();
}

定义脱敏策略

/*** 脱敏策略,枚举类,针对不同的数据定制特定的策略*/
public enum SensitiveStrategy {/*** 用户名*/USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")),/*** 身份证*/ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),/*** 手机号*/PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),/*** 地址*/ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****"));private final Function<String, String> desensitizer;SensitiveStrategy(Function<String, String> desensitizer) {this.desensitizer = desensitizer;}public Function<String, String> desensitizer() {return desensitizer;}
}

应用策略到类属性

public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {private SensitiveStrategy strategy;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeString(strategy.desensitizer().apply(value));}/*** 获取属性上的注解属性*/@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {Sensitive annotation = property.getAnnotation(Sensitive.class);if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {this.strategy = annotation.strategy();return this;}return prov.findValueSerializer(property.getType(), property);}
}

定义测试类

@Data
public class Person {/*** 真实姓名*/@Sensitive(strategy = SensitiveStrategy.USERNAME)private String userName;/*** 地址*/@Sensitive(strategy = SensitiveStrategy.ADDRESS)private String address;/*** 电话号码*/@Sensitive(strategy = SensitiveStrategy.PHONE)private String phoneNumber;/*** 身份证号码*/@Sensitive(strategy = SensitiveStrategy.ID_CARD)private String idCard;
}

定义测试接口

@GetMapping("test/sensitiveData")
public Person test(){Person user = new Person();user.setUserName("小明");user.setPhoneNumber("123456789");user.setAddress("中国辽宁省葫芦岛");user.setIdCard("52462545262256562");return user;
}

测试结果

http://localhost:8001/test/sensitiveData

在这里插入图片描述

实际使用中,可以根据自己的业务适度调整,这里只是实现了在Jackson序列化时的处理。


http://www.mrgr.cn/news/67632.html

相关文章:

  • 干货 | 2024版数字能源2030:构建万物互联的智能世界(免费下载)
  • 基于Multisim拔河比赛游戏+计分电路(含仿真和报告)
  • vue通过iframe方式嵌套grafana图表
  • leetcode21:合并两个有序列表
  • vue3中setup的作用是什么?
  • 【软考】错题分析1105
  • 想转行做大模型?AI产品经理转行必读指南
  • 牵手APP引领交友新风尚,多元匹配助力寻找心仪伴侣
  • #渗透测试#SRC漏洞挖掘# 操作系统-Linux系统基础06之ssh服务、history
  • 在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码
  • 使用Python将EPUB电子书网文主角换成自己
  • .baxia勒索病毒来袭:数据恢复与防护措施详解
  • 【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
  • 【C#】创建一个主菜单和弹出菜单系统
  • 归并排序:高效算法的深度解析
  • 卷积神经网络——pytorch与paddle实现卷积神经网络
  • 用ChatGPT完成高质量文献综述全过程实操指南,用高级学术版专业应用gpts轻松搞定
  • AndroidRuntime学习总结
  • C++对象模型:站在对象模型的尖端
  • QML中Var详细介绍
  • 掌握GLM-4大模型微调技巧:入门级实战教程——命名实体识别(NER)任务
  • WebAPI 初学 Visual Studio 2022,.NET 6.0(EF 代码迁移)
  • C++ Qt6 QtQuick/QML入门进阶与项目实战视频教程
  • 【代码分支管理】你知道什么 GitFlow 吗?
  • 你是否在为如何撰写国自然基金申请书而苦恼?快来轻松掌握申请技巧!脱颖而出
  • 2024-11-6----Android 11(全志713m)----- 关于添加 Selinux 权限