Springboot(SSM)项目实现数据脱敏

news2024/11/20 9:37:42

目录

一、引入hutool的依赖

二、sql脚本

三、自定义注解代码

3.1 自定义注解

3.2 自定义一个枚举,用于定义脱敏的类型

3.3 序列化

四、使用脱敏注解

4.1 Person.java

4.2 controller

4.3 dao

五、源代码参考


一、引入hutool的依赖

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

项目结构

 

二、sql脚本

/*
 Navicat Premium Data Transfer

 Source Server         : 192.168.14.23
 Source Server Type    : MySQL
 Source Server Version : 80031
 Source Host           : 192.168.14.23:3306
 Source Schema         : ss

 Target Server Type    : MySQL
 Target Server Version : 80031
 File Encoding         : 65001

 Date: 23/10/2023 15:43:05
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for person
-- ----------------------------
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `idCard` varchar(18) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `fixedtel` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `tel` varchar(11) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `address` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `email` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `password` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `carid` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `bankcard` varchar(19) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `registertime` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of person
-- ----------------------------
INSERT INTO `person` VALUES (1, 'zhang san', NULL, NULL, '15692536584', '河南省郑州市', NULL, '123654789', NULL, NULL, '2023-10-20 20:08:10');
INSERT INTO `person` VALUES (2, 'zhang san', NULL, NULL, '15692536584', '河南省郑州市高新区科学大道108号', NULL, '123654789', NULL, NULL, '2023-10-20 20:19:52');
INSERT INTO `person` VALUES (3, 'zhang san', NULL, NULL, '15692536584', '河南省郑州市高新区科学大道108号', NULL, '123654789', NULL, NULL, '2023-10-20 20:20:20');
INSERT INTO `person` VALUES (4, 'zhang san', NULL, NULL, '15692536584', '河南省郑州市高新区科学大道108号', NULL, '123654789', NULL, NULL, '2023-10-20 20:23:42');
INSERT INTO `person` VALUES (5, 'zhang san', '130169566636956632', NULL, '15692536584', '河南省郑州市高新区科学大道108号', NULL, '123654789', NULL, NULL, '2023-10-20 20:40:06');
INSERT INTO `person` VALUES (6, '张三丰', '136956366695687746', NULL, '13211975672', '河南省郑州市高新区科学大道108号', '123456@163.com', 'sdfgsgsgsgaa ', '陕A184d5D', '6246605000005734228', '2023-10-20 21:19:27');

SET FOREIGN_KEY_CHECKS = 1;

三、自定义注解代码

3.1 自定义注解

package com.beiyou.annotation;

import com.beiyou.enums.SensitizeRuleEnums;
import com.beiyou.serializer.SensitiveJsonSerializer;
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;

/**
 * @author 黄远超
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
//使用自定义的序列化方式
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitize {
    SensitizeRuleEnums rule();
}

3.2 自定义一个枚举,用于定义脱敏的类型

package com.beiyou.enums;

import cn.hutool.core.util.DesensitizedUtil;
import java.util.function.Function;

/**
 * @author 黄远超
 */

public enum SensitizeRuleEnums {
    /**
     * 用户id脱敏
     */
    USER_ID(s -> String.valueOf(DesensitizedUtil.userId())),

    /**
     * 中文姓名脱敏
     */
    CHINESE_NAME(DesensitizedUtil::chineseName),

    /**
     * 身份证脱敏
     */
    ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)),

    /**
     * 固定电话
     */
    FIXED_PHONE(DesensitizedUtil::fixedPhone),

    /**
     * 手机号脱敏
     */
    MOBILE_PHONE(DesensitizedUtil::mobilePhone),

    /**
     * 地址脱敏
     */
    ADDRESS(s -> DesensitizedUtil.address(s, 8)),

    /**
     * 电子邮箱脱敏
     */
    EMAIL(DesensitizedUtil::email),

    /**
     * 密码脱敏
     */
    PASSWORD(DesensitizedUtil::password),

    /**
     * 中国车牌脱敏
     */
    CAR_LICENSE(DesensitizedUtil::carLicense),

    /**
     * 银行卡脱敏
     */
    BANK_CARD(DesensitizedUtil::bankCard);

    private final Function<String, String> sensitize;

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

    SensitizeRuleEnums(Function<String, String> sensitize) {
        this.sensitize = sensitize;
    }
}

3.3 序列化

    package com.beiyou.serializer;

    import com.beiyou.annotation.Sensitize;
    import com.beiyou.enums.SensitizeRuleEnums;

    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;


    public class SensitiveJsonSerializer extends JsonSerializer<Object> implements ContextualSerializer {

        private SensitizeRuleEnums rule;

        @Override
        public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
            Sensitize annotation = beanProperty.getAnnotation(Sensitize.class);
            if (Objects.nonNull(annotation)) {
                this.rule = annotation.rule();
                return this;
            }
            return null;
        }

        @Override
        public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString(rule.sensitize().apply(o.toString()));
        }
    }

四、使用脱敏注解

第三步的时候已经将自定义注解定义出来了,那么我们只需要在实体类中添加注解,并且通过枚举指定实体属性的脱敏类型即可。

4.1 Person.java

package com.beiyou.model;

import com.beiyou.annotation.Sensitize;
import com.beiyou.enums.SensitizeRuleEnums;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Person {

    @Sensitize(rule = SensitizeRuleEnums.USER_ID)
    private Integer id;

    @Sensitize(rule = SensitizeRuleEnums.CHINESE_NAME)
    private String name;

    @Sensitize(rule = SensitizeRuleEnums.ID_CARD)
    private String idCard;

    @Sensitize(rule = SensitizeRuleEnums.FIXED_PHONE)
    private String fixedtel;

    @Sensitize(rule = SensitizeRuleEnums.MOBILE_PHONE)
    private String tel;

    @Sensitize(rule = SensitizeRuleEnums.ADDRESS)
    private String address;

    @Sensitize(rule = SensitizeRuleEnums.EMAIL)
    private String  email;

    @Sensitize(rule = SensitizeRuleEnums.PASSWORD)
    private String password;

    @Sensitize(rule = SensitizeRuleEnums.ID_CARD)
    private String carid;

    @Sensitize(rule = SensitizeRuleEnums.BANK_CARD)
    private Long bankcard;

}

4.2 controller

package com.beiyou.controller;

import com.beiyou.dao.PersonDao;
import com.beiyou.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class PersonController {

    @Autowired
    PersonDao personDao;

    @PostMapping("/insert")
    public int insert(@RequestBody Person person) {
        return personDao.insert(person);
    }

    @GetMapping("getPerson")
    public Person getPerson() {
        Person person = new Person();
        person.setId(1555555550);
        person.setName("张三丰");
        person.setIdCard("16396583578");
        person.setTel("13211975672");
        person.setAddress("河南省郑州市高新区科学大道108号");
        person.setEmail("123456@163.com");
        person.setPassword("123456");
        person.setCarid("冀A888888");
        person.setBankcard(6246605000005734228L);
        return person;
    }

    @GetMapping("getPerson1")
    public Person getPerson1(Integer id) {
        return personDao.select(id);
    }


}

4.3 dao

package com.beiyou.dao;


import com.beiyou.model.Person;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;


@Mapper
public interface PersonDao {

    @Insert("insert person(name,IdCard,fixedtel,tel,address,email,password,carid,bankcard) values (#{name},#{idCard},#{fixedtel},#{tel},#{address},#{email},#{password},#{carid},#{bankcard})")
     int insert(Person person);

    @Select("select id,name,IdCard,fixedtel,tel,address,email,password,carid,bankcard  from person  where id = #{id}")
     Person  select (Integer id);

}

 

五、源代码参考

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1641903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ftrans文件外发系统 构建安全可控文件外发流程

文件外发系统是企业数据安全管理中的关键组成部分&#xff0c;它主要用于处理企业内部文件向外部传输的流程&#xff0c;确保数据在合法、安全、可控的前提下进行外发。 文件外发系统的主要作用包括&#xff1a; 1、防止数据泄露&#xff1a;通过严格的审批流程和安全策略&…

信创 | 信创产业人才需求与培养机制:优化策略与实践探索

信创产业的人才需求与培养机制面临着多方面的挑战和机遇。首先&#xff0c;信创产业的快速发展带来了巨大的人才需求&#xff0c;但目前人才培养供给与企业发展需求之间存在不匹配的问题。这种不匹配主要表现在课程体系不健全、产教融合不够深入、校企联动性不足以及职业培训市…

eNSP-DHCP服务配置

一、拓扑结构搭建 二、主机配置 pc1、pc2 三、路由器配置 <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进图接口 [Huawei-GigabitEthernet0/0/0]ip address 192.168.0.1 24 #设置接口ip [Huawei-GigabitEthernet0/0/0]q #返回上一级 [Huawei]dhcp enable #开启DHCP服…

YOLOv5改进(一)MobileNetv3替换主干网络

前言 本篇博客主要讲解YOLOv5主干网络的替换&#xff0c;使用MobileNetv3实现模型轻量化&#xff0c;平衡速度和精度。以下为改进的具体流程~ 目录 一、改进MobileNetV3_Small 第一步&#xff1a;修改common.py,新增MobileNetV3 第二步&#xff1a;在yolo.py的parse_model函…

C++设计模式-结构型设计模式

写少量的代码来应对未来需求的变化。 单例模式 定义 保证一个类仅有一个实例&#xff0c;并提供一个该实例的全局访问点。——《设计模式》GoF 解决问题 稳定点&#xff1a; 类只有一个实例&#xff0c;提供全局的访问点&#xff08;抽象&#xff09; 变化点&#xff1a…

漏洞扫描神器:AppScan 保姆级教程(附破解步骤)

一、介绍 AppScan是IBM的一款应用程序安全测试工具&#xff0c;旨在帮助组织发现和修复应用程序中的安全漏洞。它提供了全面的功能和工具&#xff0c;用于自动化应用程序安全测试、漏洞扫描和漏洞管理。 以下是AppScan的一些主要特点和功能&#xff1a; 1. 自动化漏洞扫描&a…

RabbitMQ知识点总结和复习

之前项目中用到RabbitMQ的场景主要是订单信息的传递&#xff0c;还有就是利用RabbitMQ的死信队列属性设置&#xff0c;实现延迟队列效果&#xff0c;实现超时支付取消功能&#xff0c;以及在两个不同项目中传递数据等场景。 最近几年的工作中都是一直用的RabbitMQ&#xff0c;…

谈谈Tcpserver开启多线程并发处理遇到的问题!

最近在学习最基础的socket网络编程&#xff0c;在Tcpserver开启多线程并发处理时遇到了一些问题&#xff01; 说明 在linux以及Windows的共享文件夹进行编写的&#xff0c;所以代码中有的部分使用 #ifdef WIN64 ... #else ... #endif 进入正题&#xff01;&#xff01;&…

Word文件后缀

Word文件后缀 .docx文件为Microsoft Word文档后缀名&#xff0c;基于XML文件格式 .dotm为Word启用了宏的模板 .dotx为Word模板 .doc为Word97-2003文档&#xff0c;二进制文件格式 参考链接 Word、Excel 和 PowerPoint 的文件格式参考 Learn Microsoft

基于OpenCv的图像特征点检测

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

蓝桥杯练习系统(算法训练)ALGO-947 贫穷的城市

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 某城市有n个小镇&#xff0c;编号是1~n。由于贫穷和缺乏城市规划的人才&#xff0c;每个小镇有且仅有一段单向的公路通往别…

Activiti7 开发快速入门【2024版】

记录开发最核心的部分&#xff0c;理论结合业务实操减少废话&#xff0c;从未接触工作流快速带入开发。假设你是后端的同学学过JAVA和流程图&#xff0c;则可以继续向后看&#xff0c;否则先把基础课程书准备好先翻翻。 为什么要工作流 比起直接使用状态字段&#xff0c;工作…

上海计算机学会2021年1月月赛C++丙组T2康托表

题目背景 康托是一名数学家&#xff0c;他证明了一个重要的定理&#xff0c;需要使用一张表&#xff1a; 这个表的规律是&#xff1a; 从上到下&#xff1a;每一行的分子依次增大&#xff1b;从左到右&#xff1a;每一列的分母依次增大。 康托以一种不重复、不遗漏的方式&am…

旅游系列之:庐山美景

旅游系列之&#xff1a;庐山美景 一、路线二、住宿二、庐山美景 一、路线 庐山北门乘坐大巴上山&#xff0c;住在上山的酒店东线大巴游览三叠泉&#xff0c;不需要乘坐缆车&#xff0c;步行上下三叠泉即可&#xff0c;线路很短 二、住宿 长江宾馆庐山分部 二、庐山美景

基于ZYNQ7020的ARM+FPGA模块化仪器

模块化仪器平台基于 FPGA控制器&#xff0c; 搭配丰富灵活的仪器模块&#xff0c;如万⽤表、⽰波器、信 号发⽣器、数据记录仪、⾳频分析仪等&#xff0c;涵盖了⾼精度信号、⾼速与射频信号测试测量与处理&#xff0c;提供了从验证到试产到量产的全过程测试测量技术与解决⽅案&…

实景AI自动直播系统引领直播新时代,争做行业销量领跑者。

实景AI自动直播系统引领直播新时代&#xff0c;争做行业销量领跑者&#xff01; 在当今时代&#xff0c;随着科技的飞速发展&#xff0c;AI技术正逐渐渗透到各个行业中。马云曾明确指出&#xff0c;新兴事物经历着从“看不见”、“看不起”、“看不懂”到“来不及”的四个阶段。…

C语言案例04 -流程控制-逻辑符的正确使用

****一.C语言逻辑运算符详解&#xff1a;逻辑与&&与逻辑或||的运用及其短路特性 你知道吗&#xff1f;逻辑运算符&&和||可是C语言世界的“流量担当”&#xff0c;它们不仅实力强大&#xff0c;还自带神秘光环——短路效应 &#x1f4dd;短路法则揭秘&#xf…

短视频矩阵系统ai剪辑 矩阵 文案 无人直播四合一功能核心独家源头saas开发

抖去推矩阵AI小程序是一款针对短视频平台的智能创作和运营工具&#xff0c;它具有以下功能特点&#xff1a; 1.批量视频生成&#xff1a;抖去推可以在短时间内生成大量视频&#xff0c;帮助商家快速制作出适合在短视频平台上推广的内容 2.全行业覆盖&#xff1a;适用于多个行业…

【前端学习——防抖和节流+案例】

定义 【前端八股文】节流和防抖 防抖 连续触发事件但是在设定的一段时间内只执行最后一次 代码实现思路【定时器】 大概意思就是&#xff1a; 每次按起键盘后&#xff0c;都将之前的定时器删除&#xff0c;重新开始计时。 节流 连续触发事件&#xff0c;只执行一次 …

分享一份物联网 SAAS 平台架构设计

一、架构图**** 二、Nginx**** 用于做服务的反向代理。 三、网关**** PaaS平台所有服务统一入口&#xff0c;包含token鉴权功能。 四、开放平台**** 对第三方平台开放的服务入口。 五、MQTT**** MQTT用于设备消息通信、内部服务消息通信。 六、Netty**** Socket通信设…