首页 > 其他分享 >数据脱敏实现

数据脱敏实现

时间:2024-09-27 10:25:10浏览次数:1  
标签:DesensitizedType jackson 实现 com import 数据 annotation 脱敏 fasterxml

自定义脱敏注解

package com.huiye.core.annotations;

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.huiye.core.enums.DesensitizedType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 数据脱敏注解,表示这个注解用于属性上。SensitiveJsonSerializer类进行处理序列化
 **/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive
{
    DesensitizedType desensitizedType();
}

序列化过滤

package com.huiye.core.annotations;

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 com.huiye.core.enums.DesensitizedType;

import java.io.IOException;
import java.util.Objects;


/**
 * 数据脱敏序列化过滤
 *
 */
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer
{
    private DesensitizedType desensitizedType;

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException
    {
        gen.writeString(desensitizedType.desensitizer().apply(value));
    }

    @Override
    public 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.desensitizedType = annotation.desensitizedType();
            return this;
        }
        return prov.findValueSerializer(property.getType(), property);
    }


}
脱敏类型枚举,不同的类型处理脱密的数据不同。
package com.huiye.core.enums;

import java.util.function.Function;

/**
 * 脱敏类型,不同的类型处理脱密的数据不同。

 */
public enum DesensitizedType
{
    /**
     * 姓名,第2位星号替换
     */
    USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")),


    /**
     * 身份证,中间10位星号替换
     */
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1** **** ****$2")),

    /**
     * 手机号,中间4位星号替换
     */
    PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),

    /**
     * 电子邮箱,仅显示第一个字母和@后面的地址显示,其他星号替换
     */
    EMAIL(s -> s.replaceAll("(^.)[^@]*(@.*$)", "$1****$2")),

    /**
     * 银行卡号,保留最后4位,其他星号替换
     */
    BANK_CARD(s -> s.replaceAll("\\d{15}(\\d{3})", "**** **** **** **** $1"));


    private final Function<String, String> desensitizer;

    DesensitizedType(Function<String, String> desensitizer)
    {
        this.desensitizer = desensitizer;
    }
    // 获取脱密类型。
    public Function<String, String> desensitizer()
    {
        return desensitizer;
    }
}

使用注解

 @Sensitive(desensitizedType=DesensitizedType.PHONE)
    private String phone;

 

标签:DesensitizedType,jackson,实现,com,import,数据,annotation,脱敏,fasterxml
From: https://www.cnblogs.com/yylucky666/p/18435158

相关文章

  • 揭开亚马逊摘要数据的艺术
    今天带你深入探讨亚马逊数据挖掘的魅力,帮助你挖掘潜在的商业机会和市场观点。一、为什么要抓取亚马逊数据?亚马逊作为全球最大的电商平台,拥有海量的产品和用户数据。通过抓取这些数据,商家可以了解市场趋势、竞争对手策略、消费者偏好等,从而做出更明智的决策。二、数据摘要的关键指标......
  • 欧姆龙PLC数据 转 profinet IO项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 24 网关采集欧姆龙PLC数据 25 用PROFINETIO协议转发数据 56 案例总结 71 案例说明设置网关采集欧姆龙PLC数据把采集的数据转成profinetIO协议转发给其他系统。2 VFBOX网关工作原理VFBOX网关是协议转换网关,是把一种......
  • 一篇文章教你用python玩转数据透视表PivotTable
    目录建数据透视表 配置行列字段添加列字段配置“值字段” 关闭分类汇总设置表格形式显示读取数据来透视表内容读取rowfield的内容读取valuefield的内容筛选透视表添加行标签筛选添加筛选标签(Pagefield)排序透视表 本文主要介绍excel的数据透视表常见的操......
  • SQL常用数据过滤 - EXISTS运算符
            SQL查询中的EXISTS运算符用于检查查询子句是否存在满足特定条件的记录,如果有一条或者多条记录存在,则返回True,否则返回False。语法结构SELECTcolumn_name(s)FROMtable_nameWHEREEXISTS(SELECTcolumn_nameFROMtable_nameWHEREcondition);EXISTS直接......
  • Flink(二)搭建Maven工程实现WordCount
    开发环境编写WordCountpom文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=&qu......
  • 欧姆龙PLC数据 转 profinet IO项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 24 网关采集欧姆龙PLC数据 25 用PROFINETIO协议转发数据 56 案例总结 71 案例说明设置网关采集欧姆龙PLC数据把采集的数据转成profinetIO协议转发给其他系统。2 VFBOX网关工作原理VFBOX网关是协议转换网关,是把一......
  • 获取某宝商品详情:Java爬虫数据的艺术
    某宝商品详情的重要性商品详情包括商品标题、价格、销量、评价、图片等信息,这些信息对于市场分析、客户洞察、内容监控等多种业务场景至关重要。Java爬虫基础Java爬虫是指使用Java语言编写的程序,用于从互联网上的网页中提取数据。Java爬虫通常使用HTTP客户端库(如HttpClient、OkHttp......
  • PARTV-Oracle实例架构-Oracle数据库实例
    13.Oracle数据库实例13.1.Oracle数据库实例简介13.1.1.数据库实例结构13.1.2.数据库实例配置13.2.实例启动与关闭概述13.2.1.实例概述与数据库启动13.2.2.数据库概述与实例关闭13.3.检查点概述13.3.1.检查点目的13.3.2.Oracle数据库初始化检查点的时间13.4.......
  • 批量处理数据
    privatereadonlySemaphoreSlim_throttler=newSemaphoreSlim(16);//允许指定同时可以访问资源的线程数。publicasyncTaskBatchTaskTest<T>(List<T>lst,intbatchSize=100){varbatches=lst.Select((item,index)=>new{......
  • Mybatis Plus多源数据库和自动更新updateTime问题
    多源数据库配置1、依赖配置implementation'com.baomidou:mybatis-plus-boot-starter:3.5.2'implementation'com.baomidou:dynamic-datasource-spring-boot-starter:3.5.2'2、配置文件spring:datasource:dynamic:primary:master#设置默认的数据......