如何对关键字段进行脱敏(二)如何在某些查询中取消脱敏?

要在使用Mybatis-plus进行数据库查询时准确区分哪些查询需要脱敏,哪些不需要,同时保留获取精确手机号码的能力,可以采用以下方案:

  1. 自定义注解标记

创建一个自定义注解,用于标记不需要脱敏的查询方法:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NoDesensitize {
}
  1. 自定义拦截器

编写一个自定义的Mybatis拦截器,在其中实现脱敏逻辑:

@Slf4j
@Intercepts({@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})})
public class DesensitizationInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object result = invocation.proceed();Method method = getInvokedMethod(invocation);if (method.isAnnotationPresent(NoDesensitize.class)) {// 检查方法是否有@NoDesensitize注解, 有注解的直接返回,不做脱敏处理return result;}if (result instanceof List && DesensitizationContext.isDesensitizationEnabled()) {for (Object obj : (List) result) {desensitize(obj);}} else if (DesensitizationContext.isDesensitizationEnabled()) {desensitize(result);}return result;}private Method getInvokedMethod(Invocation invocation) {try {// 获取目标对象Object target = invocation.getTarget();// 获取方法名String methodName = invocation.getMethod().getName();// 获取方法参数Object[] args = invocation.getArgs();// 获取目标对象的所有方法Method[] methods = target.getClass().getMethods();// 遍历查找匹配的方法for (Method method : methods) {if (method.getName().equals(methodName) && method.getParameterTypes().length == args.length) {return method;}}// 如果没有找到匹配的方法,抛出异常throw new NoSuchMethodException("No matching method found for " + methodName);} catch (Exception e) {log.error("获取被调用方法失败", e);return null;}}private void desensitize(Object obj) {if (obj == null) {return;}// 使用反射获取字段并进行脱敏处理Field[] fields = obj.getClass().getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(Sensitive.class)) {Sensitive sensitive = field.getAnnotation(Sensitive.class);field.setAccessible(true);try {String value = (String) field.get(obj);if (value != null) {field.set(obj, desensitizeValue(value, sensitive.type()));}} catch (IllegalAccessException e) {e.printStackTrace();}}}}private String desensitizeValue(String value, SensitiveType type) {switch (type) {case MOBILE:return DesensitizedUtil.mobilePhone(value);case EMAIL:return DesensitizedUtil.email(value);case ID_CARD:return DesensitizedUtil.idCardNum(value, 1, 2);default:return value;}}
}
  1. 配置拦截器

在Mybatis-plus配置中添加自定义拦截器:

@Configuration
public class MybatisPlusConfig {@Beanpublic Interceptor desensitizationInterceptor() {return new DesensitizationInterceptor();}//....其他配置省略 
}
  1. 使用方法
  • 对于需要脱敏的查询,正常使用Mapper方法即可。
  • 对于不需要脱敏的查询,在Mapper接口方法上添加@NoDesensitize注解:
public interface UserMapper extends BaseMapper<User> {@NoDesensitizeUser selectUserWithFullMobile(Long id);
}
  1. 动态控制脱敏

如果需要更灵活地控制脱敏,可以考虑使用ThreadLocal来存储当前线程的脱敏状态:

public class DesensitizationContext {private static ThreadLocal<Boolean> desensitizeFlag = ThreadLocal.withInitial(() -> true);public static void enableDesensitization() {desensitizeFlag.set(true);}public static void disableDesensitization() {desensitizeFlag.set(false);}public static boolean isDesensitizationEnabled() {return desensitizeFlag.get();}public static void clear() {desensitizeFlag.remove();}
}

然后在拦截器中根据这个状态决定是否执行脱敏:

@Override
public Object intercept(Invocation invocation) throws Throwable {Object result = invocation.proceed();//省略其他代码.....if (DesensitizationContext.isDesensitizationEnabled()) {return desensitizeResult(result);}//省略其他代码.....return result;
}

在需要获取精确手机号码的业务逻辑中,可以这样使用:

try {DesensitizationContext.disableDesensitization();User user = userMapper.selectById(id);// 使用完整的手机号码进行操作
} finally {DesensitizationContext.enableDesensitization();
}

这种方案既能满足大部分查询的脱敏需求,又能在特定场景下灵活控制是否进行脱敏,同时保留了获取精确手机号码的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP模型每层内容和传输单位

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;模型是一种用于描述网络通信中协议层次结构的模型&#xff0c;它最初被设计用来描述互联网的协议栈。TCP/IP模型通常分为四层&#xff0c;自下而上分别为&#xff1a; 网络接入层&#xff08;Ne…

js之模糊搜索

多的不说 少的不唠 直接上代码

使用el-form自定义校验的同时使用v-if/v-show引起的校验问题

有时候需要根据不同的条件来回显具体的内容&#xff0c;这时候就会用到v-if/v-show&#xff0c;此时表单的校验就可能会出现一些问题。 比如&#xff1a;使用v-if的时候&#xff0c;明明切换到了另一个条件&#xff0c;但是对应元素的表单校验却没有生效&#xff1b;使用v-show…

警翼警用记录仪视频格式化后恢复方法

警翼是国内较大的一家警用记录仪厂商&#xff0c;此品牌我们恢复过很多&#xff0c;此次遇到的是一个典型的误格式化的情况&#xff0c;我们来看看误格式化后如何恢复。 故障存储: 32G卡/fat32 故障现象: 客户提供的信息是在交接设备后没有及时备份而做出了初始化设备的操…

养老院管理系统-计算机毕业设计源码00010

养老院管理系统的设计与实现 摘要 本文介绍了一种基于Spring Boot框架的养老院管理系统的设计与实现。该系统旨在帮助养老院管理者更有效地管理机构内的各项事务&#xff0c;并提供更好的服务于老年人。系统的设计考虑了养老院管理的特殊需求&#xff0c;包括系统用户、老人信息…

高二的他已通过NOI保送北大了,让我们一起了解他的信息学奥赛学习经历吧!!!

相信关注本号的各位&#xff0c;对于信息学奥赛已经不陌生了&#xff0c;部分同学也已经开始踏入信息学的旅程&#xff0c;但前路茫茫&#xff0c;让我们一起看看已经取得成就的同学的经历吧。 今天要介绍的这位同学&#xff0c;是来自深圳中学的高二某班的欧阳达晟同学&#x…

简洁纯文字类的Typecho主题wenso

主题介绍 文章说说类博客网站源码&#xff0c;页面清新简洁。适合文章说说美文博客网站建站使用&#xff0c;响应式手机版本。 本来是dedecms的模板&#xff0c;也比较简单&#xff0c;适合用来搭建一个文学类的&#xff0c;纯文字的网站&#xff0c;简单的改成了typecho&…

AI写作开启新篇章

AI写作开启新篇章 随着人工智能技术的飞速发展&#xff0c;AI写作逐渐成为一种新的趋势和工具。它不仅为个人写作提供了便利&#xff0c;也在企业内容生产、学术研究、创意写作等领域展现了广泛的应用前景。AI写作的核心在于利用自然语言处理&#xff08;NLP&#xff09;技术&…

3086. 拾起 K 个 1 需要的最少行动次数 Hard

给你一个下标从 0 开始的二进制数组 nums&#xff0c;其长度为 n &#xff1b;另给你一个 正整数 k 以及一个 非负整数 maxChanges 。 Alice 在玩一个游戏&#xff0c;游戏的目标是让 Alice 使用 最少 数量的 行动 次数从 nums 中拾起 k 个 1 。游戏开始时&#xff0c;Alice 可…

JVM 堆内存结构 年轻代 老年代

堆内存 内存划分 对于大多数应用&#xff0c;Java 堆是 Java 虚拟机管理的内存中最大的一块&#xff0c;被所有线程共享。此内存区域的唯一目的就是存放对象实例&#xff0c;几乎所有的对象实例以及数据都在这里分配内存。 为了进行高效的垃圾回收&#xff0c;虚拟机把堆内存…

线程池的七大核心参数

今天了解到线程池的七大核心参数包括&#xff1a; 1. 核心线程数&#xff08;corePoolSize&#xff09;&#xff1a;线程池中能够同时执行的线程数量。 2. 最大线程数&#xff08;maximumPoolSize&#xff09;&#xff1a;线程池中允许的最大线程数量。 3. 线程空闲时间&#…

小白 | 华为云docker设置镜像加速器

一、操作场景 通过docker pull命令下载镜像中心的公有镜像时&#xff0c;往往会因为网络原因而需要很长时间&#xff0c;甚至可能因超时而下载失败。为此&#xff0c;容器镜像服务提供了镜像下载加速功能&#xff0c;帮助您获得更快的下载体验。 二、约束与限制 构建镜像的客…

6年铲屎官测评宠物空气净化器哪款好,热门养宠空气净化器排名

作为一名资深猫奴&#xff0c;发现很多铲屎官每到春秋换季就开始疯狂打喷嚏、突然开始全身过敏。其原因是猫毛一到换季就开始疯狂掉毛&#xff0c;相对于可见猫毛&#xff0c;漂浮在空气中的浮毛就是罪灰祸首。微小的浮毛在空气总容易被人体吸入体内&#xff0c;而浮毛上面附带…

【Python机器学习】模型评估与改进——在模型选择中使用评估指标

我们通常希望&#xff0c;在使用GridSearchCV或cross_val_score进行模型选择时能够使用AUC等指标。scikit-learn提供了一种非常简单的实现方法&#xff0c;那就是scoring参数&#xff0c;它可以同时用于GridSearchCV和cross_val_score。你只需要提供一个字符串&#xff0c;用于…

Appium自动化测试框架3

滑动与拖拽 swipe 滑动时间的长短会影响最后的结果的 是有一定误差的 from appium import webdriver import time # 启动一个字典 包装相应的启动参数 desired_caps dict() # 平台的名字&#xff0c;安卓还是IOS 大小写无所谓 desired_caps[platformName] Android # 平台的…

软考(高项)系统分析师--开篇

文章目录 前言一、学习过程&#xff1a;二、考试过程&#xff1a;总结: 前言 博客主在2024年05月22号参加了高项的系统分析师考试&#xff0c;在此进行一个经验总结以供小伙伴参考,如果想参考博客主学习资料的可以在下方留言进行交流。 一、学习过程&#xff1a; 先说下时间&…

2.5 C#视觉程序开发实例1----设计一个IO_Manager

2.5 C#视觉程序开发实例1----设计一个IO_Manager 第一步目标&#xff1a; 1 实现获取IO触发信号Trig0 2 能够实现程序切换 3 图像处理后能够输出一个脉冲 1 IO 引脚定义 1.1 输入信号定义 1.2 输出信号定义 2 IO时序图 2.1 触发时序 2.2 切换程序时序图 3 IO_Manager.cs …

半实物仿真测试系统

设备组成 test系统主要由硬件部分与软件部分组成。硬件部分由PCI机箱、PCI控制器以及各种PCI接口板卡组成。软件部分由测试设计软件模块、测试执行服务软件模块、测试执行客户端软件模块、设备资源管理软件模块等主要软件模块以及曲线数据生成、CRC插件生成与诊断、测试数据记录…

MPI hello world SSH 免密互联

目标&#xff1a; 我们想实现2台主机免密互联&#xff0c;将MPI Hello World跑起来 假设hostname是node01,node02,&#xff08;Linux shell窗口一般是UserNameHostName&#xff0c;node1和node2一定要和HostName一样&#xff09; hostname是/etc/hosts中的配置&#xff0c;如下…