首页 > 其他分享 >SpringBoot使用自定义注解实现数据脱敏

SpringBoot使用自定义注解实现数据脱敏

时间:2023-08-19 22:32:46浏览次数:41  
标签:springbootdemo SpringBoot 自定义 example import com annotation 脱敏

我们在日常开发中,经常有一些数据中的部分需要隐藏起来,达到数据安全的目的,这一个过程就是数据脱敏。

一、自定义数据脱敏枚举类

package com.example.springbootdemo.enums;

import lombok.Getter;

import java.util.function.Function;

/**
 * 数据脱敏策略枚举
 */
@Getter
public enum DesensitizationStrategyEnum {
    /**
     * 用户名
     */
    USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")),
    /**
     * 身份证
     */
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),
    /**
     * 手机号
     */
    PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
    /**
     * 地址
     */
    ADDRESS(s -> s.replaceAll("(\\S{4})\\S{2}(\\S*)\\S{2}", "$1****"));


    private final Function<String, String> desensitizer;

    DesensitizationStrategyEnum(Function<String, String> desensitizer) {
        this.desensitizer = desensitizer;
    }

    public Function<String, String> desensitizer() {
        return desensitizer;
    }

}

二、自定义数据脱敏序列化类

package com.example.springbootdemo.bean;

import com.example.springbootdemo.annotation.Desensitization;
import com.example.springbootdemo.enums.DesensitizationStrategyEnum;
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 java.io.IOException;
import java.util.Objects;

/**
 * @author qx
 * @date 2023/08/19
 * @desc 自定义Json序列化 用于对使用脱敏注解的字段进行数据脱敏
 */
public class DesensitizationJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
    private DesensitizationStrategyEnum strategy;

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

    /**
     * 获取属性上的注解属性
     */
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws
            JsonMappingException {
        Desensitization annotation = property.getAnnotation(Desensitization.class);
        if (Objects.nonNull(annotation) && Objects.equals(String.class,
                property.getType().getRawClass())) {
            this.strategy = annotation.strategy();
            return this;
        }
        return prov.findValueSerializer(property.getType(), property);
    }
}


三、自定义数据脱敏注解

package com.example.springbootdemo.annotation;

import com.example.springbootdemo.bean.DesensitizationJsonSerializer;
import com.example.springbootdemo.enums.DesensitizationStrategyEnum;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

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

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
// 使用jackson注解
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizationJsonSerializer.class)
public @interface Desensitization {

    DesensitizationStrategyEnum strategy();
}

四、定义一个实体类进行测试

在属性加上自定义的数据脱敏注解,实现对返回的数据进行数据脱敏。

package com.example.springbootdemo.bean;

import com.example.springbootdemo.annotation.Desensitization;
import com.example.springbootdemo.enums.DesensitizationStrategyEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * @author qx
 * @date 2023/08/19
 * @desc 数据实体
 */
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    @Desensitization(strategy = DesensitizationStrategyEnum.USERNAME)
    private String userName;

    @Desensitization(strategy = DesensitizationStrategyEnum.ADDRESS)
    private String address;

    @Desensitization(strategy = DesensitizationStrategyEnum.PHONE)
    private String phone;

    @Desensitization(strategy = DesensitizationStrategyEnum.ID_CARD)
    private String idCard;
}

五、测试

package com.example.springbootdemo.controller;

import com.example.springbootdemo.bean.Student;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author qx
 * @date 2023/08/19
 * @desc 测试
 */
@RestController
public class DesensitizationController {

    /**
     * 数据脱敏测试
     *
     * @return
     */
    @GetMapping("/testDesensitization")
    public Student test() {
        return new Student("qx", "广东省广州市天河区天河路", "18878889999", "450322210227355544");
    }
}

我们启动项目,在浏览器上测试这个请求。

SpringBoot使用自定义注解实现数据脱敏_数据脱敏

我们可以看到返回的数据已经加上了数据脱敏的功能,实现对部分数据进行隐藏。

标签:springbootdemo,SpringBoot,自定义,example,import,com,annotation,脱敏
From: https://blog.51cto.com/u_13312531/7152703

相关文章

  • 社区版idea插件spring assistant开发springboot项目返回jsp
    最近了解到社区版idea没有专门的sringboot,网上网友提供支持说是springboot社区版有几种开发模式:springinitilizer:https://start.spring.io/在线创建springassistant插件支持(具体版本可以去github找)这次我选择第二种,然而在springboot开发返回jsp页面一直报错前端页面报错:后端控......
  • 2-08-Feign-自定义配置
    Feign可以支持很多的自定义配置,如下表所示:类型作用说明feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULLfeign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象feign.codec.Encoder请求参......
  • Sql server-自定义函数
    定义:一种方法1.创建函数,求该银行的金额总和--(没有参数,返回标量值)gocreatefunctiongetsumcardbalance()returnmoneyasbegindeclare@sumcardbalancemoneyset@sumcardbalance=(selectsum(cardbalance)frombankcard)return@sumcardbalance end2.调用验证select......
  • 基于SpringBoot的在线拍卖系统
    随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单管理、留言板管理、系统管理,用户;首页、个人中心、历......
  • 两步实现springBoot导出带动态表格的word docx文档
    1.第一步导入poi依赖<!--ApachePOI--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>......
  • 基于springboot的医护人员排班系统
    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了医护人员排班系统的开发全过程。通过分析医护人员排班系统管理的不足,创建了一个计算机管理医护人员排班系统的方案。文章介绍了医护人员排班系统的系统分析部分,包括可行性分析等,系统设......
  • 基于springboot图书个性化推荐系统的设计与实现
    本论文主要论述了如何使用JAVA语言开发一个图书个性化推荐系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述图书个性化推荐系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分......
  • 基于springboot网页时装购物系统
    项目内容及可行性分析制作一个可以供消费者购买商品的网上购物平台,用户可以点击自己需要购买的商品,然后完成购买。该系统主要分为用户模块和管理员模块,用户模块主要关于系统的功能方面的使用,管理员模块则是专注于后台对于系统的维护与信息管理;用户模块具有:登陆、注册、商品查询、商......
  • 基于springboot学生心理咨询评估系统
    使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在学生心理咨询评估信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的学生心理咨询评估系统有管理员和用户。管理员可以......
  • 快速创建一个SpringBoot项目
    一、概述使用社区版创建SpringBoot脚手架的时候,如果使用SpringBoot的官网创建,一旦无法联网就无法创建。下面提供两种创建地址,一种国内的,一种是官网创建。二、解决办法1.使用Spring官网进行创建https://start.spring.io/ 点击下面的按钮获取代码,用idea导入......