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

要在使用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 {
    @Override
    public 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 {
  @Bean
    public Interceptor desensitizationInterceptor() {
        return new DesensitizationInterceptor();
    }
    //....其他配置省略 
}
  1. 使用方法
  • 对于需要脱敏的查询,正常使用Mapper方法即可。
  • 对于不需要脱敏的查询,在Mapper接口方法上添加@NoDesensitize注解:
public interface UserMapper extends BaseMapper<User> {

    @NoDesensitize
    User 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.mfbz.cn/a/771410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ansible执行任务时,报错/usr/bin/env node没有文件或目录。

报错如图&#xff1a; 解决&#xff1a;添加软链即可 sudo ln -s /home/app/node-v18.20.3/bin/node /usr/bin/node

C语言入门-结构体6

结构体入门 编写程序&#xff0c;用struct分别表示平面上的点和平面上的矩形。 #include <stdio.h> int main() { struct point {int x; int y;}; struct point p1 {1, 2}; printf(“(%d, %d)\n”, p1.x, p1.y); struct rectangle {struct point p1;struct point p2;…

电脑回收站删除的文件怎么恢复?5个恢复方法详解汇总!

电脑回收站删除的文件怎么恢复&#xff1f;在我们日常使用电脑的过程中&#xff0c;难免会遇到误删文件的情况。一旦发现自己误删文件了&#xff0c;先不要着急&#xff0c;还是有很多方法可以找回的。市面上还是有很多好用的文件恢复软件可以使用&#xff0c;具体介绍如下。 本…

使用 pyecharts 渲染成图片程序报错: echarts is not defined问题处理

背景 之前写的使用 snapshot_selenium 来保存pyeacharts渲染成的网页截图&#xff0c;可以正常运行。程序搁置了半年&#xff0c;不知道动了电脑哪里&#xff0c;再次运行程序时&#xff0c;程序开始报错&#xff1a;JavascriptException: javascript error: echarts is not d…

土壤养分化验仪:农业生态与可持续发展

随着现代农业技术的不断进步&#xff0c;土壤养分化验仪在农业生产中扮演着越来越重要的角色。这款高科技设备以其高精度、高效率的特点&#xff0c;为农业生态与可持续发展提供了强有力的支撑。 一、农田土壤监测与管理 农田是土壤养分化验仪最主要的应用场所。通过对农田土壤…

软件测试面试200问(含答案+文档)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

三菱plc gxwork3 0X121201F 报错;三菱标签区域的保留容量不足;

如果占用过多把r文件寄存器的地址范围改小&#xff0c;一般文件寄存器的地址r0-8000足够了

CLAM用于弱监督WSI分析

计算病理学&#xff08;computational pathology&#xff09;下的深度学习方法需要手动注释大型 WSI 数据集&#xff0c;并且通常存在领域适应性和可解释性较差的问题。作者报告了一种可解释的弱监督深度学习方法&#xff0c;只需要WSI级标签。将该方法命名为聚类约束注意力多实…

uniapp自定义富文本现实组件(支持查看和收起)

废话不多说上代码 CollapseText.vue <template><view v-if"descr"><scroll-view class"collapse-text" :style"{maxHeight: computedMaxHeight}"><!-- <slot></slot> --><rich-text :nodes"descr&q…

【双出版加持!录用率高!见刊、检索更稳定!】第六届结构抗震与土木工程研究国际学术会议 (ICSSCER 2024,8月16-18)

随着社会的发展&#xff0c;城市规模的不断扩大&#xff0c;建筑形态也趋于多样化和复杂化&#xff0c;建筑结构形式逐渐由规则简单向高层、大跨甚至特殊复杂的方向发展。而房屋建筑是人们正常生活和生产活动的基本场所&#xff0c;房屋建筑结构的安全必须得到充分保障。但是&a…

揭秘品牌成功秘诀:品牌营销策略的核心要素大公开

品牌营销作为企业战略中至关重要的一环&#xff0c;其核心是建立和传播品牌的独特魅力&#xff0c;使其在消费者心目中占据重要位置。 一个成功的品牌营销策略能够提升品牌的知名度和影响力&#xff0c;带来持续的销售和忠诚客户群体。 在当今竞争激烈的市场环境中&#xff0…

初阶数据结构之二叉树

那么本篇文是初阶数据结构这个系列的最后一篇文章&#xff0c;那么闲话少叙&#xff0c;我们直接进入正题 在讲二叉树的一些之前知识点之前&#xff0c;我先给大家送个小礼物哈 手搓二叉树 typedef int BTDataType ; typedef struct BinaryTreeNode { BTDataType _data …

Mybatis-Plus eq ne gt lt ge le分别代表含义 条件构造器

一、条件构造器函数列表 函数名说明说明/例子allEq入参都满足条件例&#xff1a;allEq({"id": 1, "name": "张三", "age": null})--->id 1 and name 张三 and age is nulleq等于例&#xff1a;eq("name", "张三…

dc-3靶机渗透

环境准备 dc-3靶机下载链接&#xff1a; https://download.vulnhub.com/dc/DC-3-2.zip 启动靶机遇到的问题解决文章在下面 http://t.csdnimg.cn/zLQAI kali最新版 dc-3靶机 两台机器都在vmware上运行 网络设置NAT模式 渗透过程 信息收集 首先使用ifconfig获取kali的IP地址 可…

day04-组织架构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-树组件应用树形组件-用层级结构展示信息&#xff0c;可展开或折叠。 2.组织架构-树组件自定义结构3.组织架构-获取组织架构数据4.组织架构-递归转化树形…

CSS filter(滤镜)属性,并实现页面置灰效果

目录 一、filter&#xff08;滤镜&#xff09;属性 二、准备工作 三、常用的filter属性值 1、blur(px) 2、brightness(%) 3、contrast(%) 4、grayscale(%) 5、opacity(%) 6、saturate(%) 7、sepia(%) 8、invert(%) 9、hue-rotate(deg) 10、drop-shadow(h-shadow v…

【Godot4.2】用PlantUML和语雀画UML类图

概述 UML&#xff1a;统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。PlantUML&#xff1a;是一个开源工具&#xff0c;它允许我们用文本形式来描绘和创建UML图。在VSCode中可以安装扩展来绘制&#xff0c;而在语雀的MarkDown编辑器中&#xff…

震惊!运气竟能如此放大!运气的惊人作用,你了解吗?

芒格&#xff1a;得到你想要的东西&#xff0c;最保险的办法&#xff0c;就是让自己配得上你想要的那个东西。今天仔细想了想这句话&#xff0c;他其实说的是无数成功人士的心声 —— “我配得上&#xff01;” 美剧《绝命毒师》有个导演叫文斯吉里根&#xff08;Vince Gilliga…

如何看待制造业数字化转型?从不同维度来聊一聊

作为一名TOB行业9年经验的老兵&#xff0c;近期我们团队拜访了不少制造企业&#xff0c;其以中小型企业居多&#xff0c;在与企业负责人交流数字化转型话题时&#xff0c;感触最多的还是管理者对“数字化转型”的认知。在数字化转型方面从国家层面到地方政府进行大量的宣传与政…

数据结构 1.1 数据结构的基本概念

本章总览&#xff1a; 一.什么是数据 1.数据 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程 序识别和处理的符号的集合。数据是计算机程序加工的原料。 早期计算机只能处理纯数值的问题&#xff0c;如世界第一题计算机ENI…