Spring Boot 优雅进行数据脱敏

文详细解析在Spring Boot应用中优雅地脱敏敏感信息,如手机号、邮箱、身份证等,使用的是Jackson库中的JsonSerializer

1. 创建自定义脱敏序列化器

首先,创建一个继承自JsonSerializer<String>的序列化器。以MobileSerializer为例,代码如下:

复制代码
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 java.io.IOException;

/**
 * <p>
 * 自定义手机序列号器
 * </p>
 *
 * @author snogzixian
 * @since 2023-09-24
 */
public class MobileSerializer extends JsonSerializer<String> {

    /**
     * 自定义序列化方法,用于对手机号进行脱敏处理并写入JSON生成器。
     *
     * @param mobile             要序列化的手机号
     * @param jsonGenerator      JSON生成器,用于写入序列化后的数据
     * @param serializerProvider 序列化提供者,提供序列化所需的服务
     * @throws IOException 如果在序列化过程中发生I/O错误
     */
    @Override
    public void serialize(String mobile, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        // 检查手机号是否为null或者是否是有效的手机号
        if (mobile == null || !isValidMobile(mobile)) {
            // 如果手机号无效,直接输出原始手机号
            jsonGenerator.writeString(mobile);
            return;
        }
        // 调用脱敏工具类对手机号进行脱敏处理
        String mobileDesensitized = DesensitizedUtil.mobilePhone(mobile);
        // 将脱敏后的手机号字符串写入到JSON生成器jsonGenerator中
        jsonGenerator.writeString(mobileDesensitized);
    }

    /**
     * 检查手机号的合法性
     *
     * @param mobile 手机号
     * @return 如果手机号合法则返回true,否则返回false
     */
    private boolean isValidMobile(String mobile) {
        // 在此处添加对手机号合法性的检查逻辑
        return true;
    }
}

其中,serialize方法用于处理数据的脱敏逻辑,isValidMobile用于检查数据的合法性。

2. 使用自定义序列化器

在实体类中,使用@JsonSerialize注解指定字段使用自定义序列化器。例如,对于一个用户的手机号,我们在实体类中如下使用:

复制代码
/**
 * <p>
 * 实体类
 * </p>
 *
 * @author snogzixian
 * @since 2023-09-24
 */
public class User {

    @JsonSerialize(using = MobileSerializer.class)
    private String mobile;

    // 其他字段和getter、setter
}

3. 扩展性 - 支持多类型数据脱敏

为支持多类型数据(如邮箱、身份证等)脱敏,你可以为每种数据类型创建对应的序列化器类,类似于MobileSerializer

例如,创建一个EmailSerializer处理邮箱脱敏:

复制代码
public class EmailSerializer extends JsonSerializer<String> {
    // 实现邮箱的脱敏逻辑
}

在实体类中,对应字段使用@JsonSerialize注解指定使用EmailSerializer

复制代码
public class User {
    
    @JsonSerialize(using = EmailSerializer.class)
    private String email;

    // 其他字段和getter、setter
}
相关推荐
葫芦和十三5 小时前
图解 MongoDB 13|WiredTiger 存储引擎:B-tree、页和 checkpoint 三件套
后端·mongodb·agent
葫芦和十三5 小时前
图解 MongoDB 14|Cache 与淘汰:WiredTiger 的内存治理
后端·mongodb·面试
IT_陈寒9 小时前
Vue这个坑我跳了两次,原来问题出在这
前端·人工智能·后端
人活一口气9 小时前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc
ServBay9 小时前
9 个 Python 第三方库推荐,不用 AI 都好像多出一个团队
后端·python
用户8356290780519 小时前
如何使用 Python 添加和管理 Excel 批注(完整示例)
后端·python
用户83562907805110 小时前
使用 Python 管理 Excel 工作表:创建、复制、删除与重命名
后端·python
lizhongxuan10 小时前
Agent Tool
后端
CaffeinePro10 小时前
依赖注入:FastAPI最核心的解耦能力案例解析
后端·fastapi
Assby11 小时前
从 Function Calling 到 MCP:理解 Agent 工具调用的底层通信机制
人工智能·后端