一个注解搞定接口返回数据脱敏

SpringBoot接口返回数据脱敏(Mybatis、Jackson) J数据脱敏有以下几种做法: 1、通过自定义Jackson注解,实现在属性序列化过程中处理数据 2、通过Mybatis查询数据时处理 3、其他方式 Jackson是Spring默认的序列化框架,以下将通过自定义Jackson注解,实现在序列化过程中对属性值进行处理。 对于数据库数据的加密解密将采用Mybatis的TypeHandler处理,在我们为数据库提供数据后,会根据我们的需求,对部分数据进行加密。在读取后数据最终到我们手上前,会对读取到数据进行解密。 阅读详情

在实际项目中通常需要对用户的敏感信息比如身份号、家庭地址、手机号等进行脱敏操作以保证信息安全。

解决方案

  •  每个接口单独处理,这种方式操作简单,但是重复工作量非常大,而且后续脱敏规则变更是需要逐个修改。

  • 使用定义Jackson注解,在序列化的时候对敏感字段值进行处理,这种方式高效又优雅,省时省力,支持扩展。

    这里我们使用注解的方式实现,在序列化的时候对敏感字段值进行处理。

    项目结构如下

图片

1. 新建脱敏注解类

在接口返回实体字段添加该注解并指定脱敏规则,接口返回数据当前字段会按规则脱敏。

package com.mfc.test.datamasking;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationsInside @JsonSerialize(using = DataMaskingJsonSerializer.class)public @interface DataMasking {    // 脱敏规则    MaskingRule maskingRule();}

2.新建脱敏规则设置类

该类是个枚举值,设置字段的脱敏方式

package com.mfc.test.datamasking;
import lombok.Getter;
import java.util.function.Function;
/** * 脱敏策略,不同数据可选择不同的策略 */@Getterpublic enum MaskingRule {
    /**     * 用户名脱敏     */    USERNAME(str -> str.replaceAll("(\\S)\\S(\\S*)", "$1*$2")),
    /**     * 身份证脱敏     */    ID_CARD(str -> str.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),
    /**     * 手机号脱敏     */    MOBILEPHONE(str -> str.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
    /**     * 地址脱敏     */    ADDRESS(str -> str.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****"));
    private final Function<String, String> desensitizer;
    MaskingRule(Function<String, String> desensitizer) {        this.desensitizer = desensitizer;    }}

3.新建脱敏序列化器

package com.mfc.test.datamasking;
import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.BeanProperty;import com.fasterxml.jackson.databind.JsonMappingException;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.SerializerProvider;import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import java.io.IOException;import java.util.Objects;
/** * 序列化器 */public class DataMaskingJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
    private MaskingRule maskingRule;
    @Override    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {        // 获取自定义注解        DataMasking annotation = beanProperty.getAnnotation(DataMasking.class);        // 注解不为空,且标注的字段为String        if (Objects.nonNull(annotation) && Objects.equals(String.class, beanProperty.getType().getRawClass())) {            this.maskingRule = annotation.maskingRule();            return this;        }        // 注解为空,字段不为String,寻找合适的序列化器进行处理        return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);    }
    @Override    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {        if (Objects.isNull(maskingRule)) {            // 定义规则为空,返回原字符串            jsonGenerator.writeString(s);        } else {            // 定义规则不为空,返回处理后字符串            jsonGenerator.writeString(maskingRule.getDesensitizer().apply(s));        }    }}

4.新建实体并为要脱敏的字段添加注解

package com.mfc.test.domain;
import com.mfc.test.datamasking.DataMasking;import com.mfc.test.datamasking.MaskingRule;import lombok.Data;import lombok.ToString;import lombok.experimental.Accessors;
@ToString@Accessors(chain = true)@Datapublic class Member {
    private String username;
    private String gender;
    @DataMasking(maskingRule = MaskingRule.USERNAME)    private String realName;
    @DataMasking(maskingRule = MaskingRule.ID_CARD)    private String idCard;
    @DataMasking(maskingRule = MaskingRule.MOBILEPHONE)    private String mobilePhone;
    @DataMasking(maskingRule = MaskingRule.ADDRESS)    private String address;}

5.新建controller

package com.mfc.test.controller;
import com.mfc.test.domain.Member;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;
@RestController@RequestMapping("/test")public class TestController {
    @GetMapping("/getMember")    public Member test() {        Member member = new Member();        member.setUsername("zxh")                .setGender("男")                .setRealName("张小华")                .setIdCard("610122199003142113")                .setMobilePhone("15111111111")                .setAddress("四川省成都市武侯区武侯大街1033号");        return member;    }}

访问http://localhost:8081/test/getMember

测试结果如下

图片

别再用默认参数了!手把手教你用2P2Z补偿网络优化Buck电源的动态性能 本文详细介绍了如何通过2P2Z补偿网络优化Buck电源的动态性能,解决默认参数下的负载阶跃响应问题。从频域分析到元件选型,再到实测验证,手把手教你提升相位裕度,显著降低超调量和稳定时间,适用于DCDC和开关电源设计。 阅读详情

相关推荐

宇树智能人形机器人模块化腿部动力系统技术拆解

o电机防摔防护板(3.1.5.1)→端盖总成(3.1.5.2)→电机外壳(3.1.5.4)的冲击力传递路径;o散热风扇(3.1.3.1)推动冷风→大腿基座腔体→散热片组(3.1.5.7)→中空大腿杆排出;o防御专利:覆盖“关节热管理风道接口标准”、“抗冲击结构身份编码”;o大腿杆腔体(3.1.3.4)内置反平行四边形机构,避免连杆外露。:力传感器(3.1.8.4.2)仅部署于足端,缺失关节力矩反馈。:更换行星减速器(3.1.5.5)需拆解整个电机模块;o热量传导路径:电机定子→外壳→散热片组。

weixin_50955533的博客 1232

一个注解让 Spring Boot 项目接口返回数据脱敏

当返回对象比较复杂,需要递归去反射,性能一下子就会降低,于是换种思路,我想到平时使用的 @JsonFormat,跟我现在的场景很类似,通过自定义注解跟字段解析器,对字段进行自定义解析,tql。①要做成可配置多策略的脱敏操作,要不然一个个接口进行脱敏操作,重复的工作量太多,很显然违背了“多写一行算我输”的程序员规范。思来想去,定义数据脱敏注解和数据脱敏逻辑的接口, 在返回类上,对需要进行脱敏的属性加上,并指定对应的脱敏策略操作。需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作。

weixin_JimZemlin的博客 783

HFSS15 win10_64位破解

HFSS15 win10_64位破解 找到的别人的软件,但在首次安装时失败了,并不能patched。寻找了几种方法,已成功安装。在此写下安装经验,供大家参考。 软件安装包以及破解软件: 链接:https://pan.baidu.com/s/1MMjV_31maU5QD6fmI4zfIA 提取码:yj4q 在安装之前,建议关闭杀毒软件。 Step1:进入HFSS150Win64安装包,点击au...

玉笙寒 4万+

SpringBoot实战:轻松实现接口数据脱敏

接口数据脱敏是指在Web应用程序的API接口返回数据时,对包含敏感信息的字段进行处理,使其部分或全部信息被隐藏或替换,以防止敏感信息的泄露。这个过程通常不会改变数据的原始格式,而是通过特定的算法或规则,将敏感部分替换为特定字符(如星号*)或者保留部分信息。接下来,我们创建一个自定义注解/*** 用于标记字段需要进行脱敏处理的注解*//*** 脱敏类型*//*** 脱敏起始位置*//*** 脱敏结束位置*/然后,定义枚举类/*** 脱敏类型枚举类/*** 默认脱敏。

weixin_73588491的博客 6896

RoboMaster电控入门:手把手教你用STM32CubeMX配置大疆C板CAN总线驱动GM6020电机

本文详细介绍了如何使用STM32CubeMX配置大疆C板CAN总线驱动GM6020电机,适用于RoboMaster电控入门。从硬件准备到CubeMX工程初始化,再到CAN过滤器配置和电机控制协议解析,手把手教你避开常见配置陷阱,实现精准控制。

weixin_42524762的博客 267

若依(RuoYi)项目里,Quartz定时任务踩坑实录:并发控制、事务回滚与异常处理

本文深入解析若依(RuoYi)项目中Quartz定时任务的并发控制、事务回滚与异常处理三大核心问题。通过实战案例揭示@DisallowConcurrentExecution注解的局限性和Redis分布式锁的应用,详细讲解Spring事务集成方案及多数据源事务管理,并提供生产级监控体系搭建指南,帮助开发者规避Quartz在生产环境中的常见陷阱。

weixin_28731223的博客 408

一个注解搞定SpringBoot数据脱敏

在软件开发过程中,为了避免数据泄露,我们常常需要使用一些手段对特定的数据进行保护,例如用户的手机号、身份证、项目的输出日志等等,这些敏感的数据需要做特殊处理,有的是加密,有的是打掩码,我们可以借助一些工具包优雅的实现这些功能。这里我做了一个名为SensitiveBye的工具包,它可以在Java SE、Spring环境、SpringBoot环境中使用,实现接口字段、日志输出、数据库字段、敏感词库等类型数据脱敏需求,

weixin_39128397的博客 2860

一文吃透:从零到一开发一套 ABAP RAP 应用的完整路径

ABAP RAP开发实战摘要 本文系统介绍了ABAP RESTful Application Programming Model (RAP)在企业级应用开发中的实施路径。文章以出差申请业务场景为例,详细拆解了RAP开发的六步主线流程: 数据库表设计:规范主键、审计字段设计 CDS数据建模:通过视图定义业务对象实体及关联 行为定义与实现:使用BDEF声明事务规则,Behavior Pool类实现业务逻辑 业务对象投影:裁剪服务接口视图 服务定义与绑定:按OData协议暴露服务 UI集成测试:支持Fiori E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 509

Java中使用注解的方式实现数据脱敏

本文介绍了在Java中使用注解实现数据脱敏的方案,通过自定义@Desensitize注解和DesensitizationType枚举定义脱敏规则,结合Jackson序列化实现自动脱敏处理。详细讲解了从设计思路到具体实现的完整流程,包括脱敏工具类开发、JSON序列化集成、SpringBoot配置以及测试效果展示。该方案具有低侵入性、可复用性等优势,适用于日志打印、接口返回等场景中的敏感数据保护,同时提供了扩展优化建议和使用注意事项。

huangpf_vcx 1031

【100%通过率】华为od统一考试B卷【需要打开多少监视器】JAVA&Go 实现

某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器

MISAYAONE的博客 1万+

基于CNN-LSTM融合模型的环卫车动态称重算法研究:从频率感知到精准质量估计

摘要: 针对环卫车辆动态称重需求,本研究提出一种基于CNN-LSTM融合网络的频率分析方法。通过在实验室构建振动频率采集系统,获取不同载重下的结构响应数据,经MATLAB进行信号处理和特征提取后,建立频率-质量的非线性映射模型。实验表明,该算法在静态和模拟动态场景下平均绝对误差小于1.5%,显著优于传统方法,为环卫车智能化管理提供了高精度实时称重方案。 关键词: 动态称重;深度学习;频率分析;CNN-LSTM;MATLAB。

AI的内部世界的博客 374

太强了,一个注解搞定接口返回数据脱敏

下午惬意时光,突然产品小姐姐走到我面前,打断我短暂的摸鱼time,企图与我进行深入交流,还好我早有防备没有闪,打开瑞star的点单页面,暗示没有一杯coffee解决不了的需求,需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作,我思考一反,表示某问题,马上安排。...

java_beautiful的博客 163

CTK Plugin Framework插件框架学习1--Qt编译CTK

【代码】Qt编译CTK。

贝勒里恩的博客 7432

太强大,一个注解搞定接口返回数据脱敏

点击关注公众号,利用碎片时间学习下午惬意时光,突然产品小姐姐走到我面前,打断我短暂的摸鱼time,企图与我进行深入交流,还好我早有防备没有闪,打开瑞star的点单页面,暗示没有一杯coffee解决不了的需求,需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作,我思考一反,表示某问题,马上安排。思路1.要做成可配置多策略的脱敏操作,要不然一个个接口进行脱敏操作,重复...

Java笔记虾 420

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

一个注解搞定接口返回数据脱敏,爱了爱了

文章来源:https://c1n.cn/cf7g4‍‍‍目录背景思路实现代码背景下午惬意时光,突然产品小姐姐走到我面前,打断我短暂的摸鱼 time,企图与我进行深入交流,还好我早有防备没有闪,打开瑞 star 的点单页面,暗示没有一杯 coffee 解决不了的需求。需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作,我思考一反,表示某问题,马上安排。思路①要做成可...

石杉的架构笔记 661

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

一个注解搞定接口返回数据脱敏!

文章来源:https://c1n.cn/cf7g4目录背景思路实现代码背景下午惬意时光,突然产品小姐姐走到我面前,打断我短暂的摸鱼 time,企图与我进行深入交流,还好我早有防备没有闪,打开瑞 star 的点单页面,暗示没有一杯 coffee 解决不了的需求。需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作,我思考一反,表示某问题,马上安排。思路①要做成可配置多...

架构文摘 391

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: Serverless:无服务器架构的魅力与实践
下一篇: 学生注册管理系统
调试大师
博客等级 码龄3年 2340粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

调试大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值