SpringBoot利用自定义json序列化器实现敏感字段数据脱敏

SpringBoot利用自定义json序列化器实现敏感字段数据脱敏

物料准备:

1.hutool依赖

2.自定义的jackson序列化器

3.测试@JsonSerialize效果

引入hutool依赖

因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖。

如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.8</version>
        </dependency>

自定义jackson序列化器

自定义一个手机号脱敏序列化器

package com.example.demo.plugin;

import cn.hutool.core.util.DesensitizedUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
@Slf4j
@Component
public class MobileMskJsonSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String s,
                          JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException {

        String s1 = DesensitizedUtil.mobilePhone(s);
        log.info("mobilePhone数据:{}脱敏后的值是:{}",s,s1);
        jsonGenerator.writeString(s1);


    }
}

自定义一个邮箱脱敏序列化器

package com.example.demo.plugin;

import cn.hutool.core.util.DesensitizedUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
@Slf4j
@Component
public class MailMskJsonSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String s1 = DesensitizedUtil.email(s);
        log.info("email数据:{}脱敏后的值是:{}",s,s1);
        jsonGenerator.writeString(s1);
    }
}

注册刚刚自定义的json序列化器

package com.example.demo.plugin;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonCfg {

    @Autowired
    private MobileMskJsonSerializer  mobileMskJsonSerializer;
    @Autowired
    private MailMskJsonSerializer mailMskJsonSerializer;

    /**
     * 可以同时注册多个自定义的jackson 序列化器
     * @return
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer objectMapperBuilderCustomizer(){
        return builder -> {
            builder.serializerByType(String.class,mobileMskJsonSerializer);
            builder.serializerByType(String.class,mailMskJsonSerializer);
        };
    }


}

测试@JsonSerialize效果

在实体类中使用@JsonSerialize注解

package com.example.demo.orm.po;

import cn.hutool.core.util.DesensitizedUtil;
import com.example.demo.plugin.MailMskJsonSerializer;
import com.example.demo.plugin.MobileMskJsonSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;


@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Account implements Serializable {
    private static final long serialVersionUID = -8114863398578320034L;
    private Integer id;
    private String username;



    // @JsonSerialize 既可以用在字段上 ,也可以用在类上
    // 用在字段上时,只对某个字段生效
    // 用在类上时,对类中所有字段生效.(优先级更高)
    // 一般常用在 字段上,对某个字段做特殊的序列化处理

    //使用 手机号脱敏序列号器
    @JsonSerialize(using = MobileMskJsonSerializer.class)
    private String mobile;

    //使用 邮箱脱敏序列号器
    @JsonSerialize(using = MailMskJsonSerializer.class)
    private String mail;

}

测试查询结果

@Test
void test81902() throws JsonProcessingException {
        Account oneById = accountMapper.findOneById(17);
        System.err.println(oneById);
    
        //使用jackson 序列化java对象
        ObjectMapper objectMapper = new ObjectMapper();
        String msk = objectMapper.writerWithDefaultPrettyPrinter()
                .writeValueAsString(oneById);
        System.err.println(msk);
 }
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7135ce0a]
Account(id=17, username=ert, mobile=13273629312, mail=kew5612@163.com)
2023-07-05 20:28:38.536  INFO 17952 --- [           main] c.e.demo.plugin.MobileMskJsonSerializer  : mobilePhone数据:13273629312脱敏后的值是:132****9312
2023-07-05 20:28:38.537  INFO 17952 --- [           main] c.e.demo.plugin.MailMskJsonSerializer    : email数据:kew5612@163.com脱敏后的值是:k******@163.com
{
  "id" : 17,
  "username" : "ert",
  "mobile" : "132****9312",
  "mail" : "k******@163.com"
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ThinkPet

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

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

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

打赏作者

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

抵扣说明:

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

余额充值