MyBatis-Plus数据安全保护(字段脱敏)

news2024/11/27 20:34:45
  1. 项目创建
  2. POM依赖
    <dependency><!--MyBatis-Plus 企业级模块-->
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-mate-starter</artifactId>
        <version>1.2.8</version>
    </dependency>
  3. YML配置
    spring:
      datasource:
        # 配置安全:https://blog.csdn.net/tongxin_tongmeng/article/details/128664932
        url: mpw:IlcV2VrLIr+z3ruf0oHP1sV3JuEvntw9QZDEYhQWDNHJ9Xkm7qZokxkEeTCPNqma
        username: mpw:aoVz0lDJNymnmrhw6LkQow==
        password: mpw:StRVtLG7vB6iKVt83du7fw==
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    # Mybatis Mate 配置
    mybatis-mate:
      cert:
        # 请添加微信wx153666购买授权,不白嫖从我做起! 测试证书会失效,请勿正式环境使用
        grant: thisIsTestLicense
        license: TtY9GC88CzSkEmUhzIyvM2MJKvsgPyxoNCExH4/GhaBwuTQ93aeLaR6/dM49wMSk+oQdmqUibCM8b5H74s1Nx+2C5V3U1gKiLtddVc8Eg8oC1F2nLxOiDKDvPpdxWFGsPW6mQE2LDr+tK8GXpFS3N8xwmYy/gHCwQ4Avqp9JqBbke7pZzL2adIlxYHmCYpfNTN+NRHIEFaGFTBlzZHDb3UfJaeqLaAtWBol0QOPEM69Kz3JSemxBHnEO1ID75bwwmkgqC7Ps4z9iYAK9GLzzaPwSiFELNCmIvwa5YSJLxP9NMQUWbVGIRqehxnVqfgx/68+yIfpByqGTMxLR33yeEQ==
  4. SQL脚本
    CREATE TABLE `sentive` (
    	`id` BIGINT NOT NULL COMMENT '主键ID',
    	`chineseName` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'chineseName',
    	`idCard` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'idCard',
    	`phone` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'phone',
    	`mobile` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'mobile',
    	`address` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'address',
    	`email` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'email',
    	`bankCard` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'bankCard',
    	`password` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'password',
    	`carNumber` VARCHAR ( 255 ) DEFAULT NULL COMMENT 'carNumber',
    PRIMARY KEY ( `id` ) 
    ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
  5. 代码生成(MybatisX)
    @RestController
    @RequestMapping("/sensitive")
    public class SensitiveController {
    
        @Autowired
        private SensitiveService sensitiveService;
    
        @PostMapping("/create")
        public Boolean create(@RequestBody Sensitive sensitive) {
            return sensitiveService.save(sensitive);
        }
    
        @GetMapping("/get")
        public Sensitive get(@RequestBody Sensitive sensitive) {
            return sensitiveService.getById(sensitive.getId());
        }
    
        @GetMapping("/getAll")
        public List<Sensitive> getAll() {
            return sensitiveService.list();
        }
    
        @PutMapping("/update")
        public Boolean update(@RequestBody Sensitive sensitive) {
            return sensitiveService.updateById(sensitive);
        }
    
        @DeleteMapping("/delete")
        public Boolean delete(@RequestBody Sensitive sensitive) {
            return sensitiveService.removeById(sensitive);
        }
    
        @DeleteMapping("/deleteAll")
        public Boolean deleteAll() {
            return sensitiveService.remove(new QueryWrapper<>());
        }
    
    }
  6. 脱敏策略
    @Configuration
    public class SensitiveStrategyConfig {
    
        /**
         * 注入脱敏策略
         */
        @Bean
        public ISensitiveStrategy sensitiveStrategy() {
            return new SensitiveStrategy();
        }
    
    }
  7. 字段脱敏(@FieldSensitive)
    /**
     * 
     * @TableName sentive
     */
    @TableName(value ="sentive")
    @Data
    public class Sentive implements Serializable {
        /**
         * 主键ID
         */
        @TableId(value = "id")
        private Long id;
    
        /**
         * chineseName
         */
        @FieldSensitive(SensitiveType.chineseName)
        @TableField(value = "chineseName")
        private String chinesename;
    
        /**
         * idCard
         */
        @FieldSensitive(SensitiveType.idCard)
        @TableField(value = "idCard")
        private String idcard;
    
        /**
         * phone
         */
        @FieldSensitive(SensitiveType.phone)
        @TableField(value = "phone")
        private String phone;
    
        /**
         * mobile
         */
        @FieldSensitive(SensitiveType.mobile)
        @TableField(value = "mobile")
        private String mobile;
    
        /**
         * address
         */
        @FieldSensitive(SensitiveType.address)
        @TableField(value = "address")
        private String address;
    
        /**
         * email
         */
        @FieldSensitive(SensitiveType.email)
        @TableField(value = "email")
        private String email;
    
        /**
         * bankCard
         */
        @FieldSensitive(SensitiveType.bankCard)
        @TableField(value = "bankCard")
        private String bankcard;
    
        /**
         * password
         */
        @FieldSensitive(SensitiveType.password)
        @TableField(value = "password")
        private String password;
    
        /**
         * carNumber
         */
        @FieldSensitive(SensitiveType.carNumber)
        @TableField(value = "carNumber")
        private String carnumber;
    
        @TableField(exist = false)
        private static final long serialVersionUID = 1L;
    
        @Override
        public boolean equals(Object that) {
            if (this == that) {
                return true;
            }
            if (that == null) {
                return false;
            }
            if (getClass() != that.getClass()) {
                return false;
            }
            Sentive other = (Sentive) that;
            return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
                && (this.getChinesename() == null ? other.getChinesename() == null : this.getChinesename().equals(other.getChinesename()))
                && (this.getIdcard() == null ? other.getIdcard() == null : this.getIdcard().equals(other.getIdcard()))
                && (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone()))
                && (this.getMobile() == null ? other.getMobile() == null : this.getMobile().equals(other.getMobile()))
                && (this.getAddress() == null ? other.getAddress() == null : this.getAddress().equals(other.getAddress()))
                && (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail()))
                && (this.getBankcard() == null ? other.getBankcard() == null : this.getBankcard().equals(other.getBankcard()))
                && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()))
                && (this.getCarnumber() == null ? other.getCarnumber() == null : this.getCarnumber().equals(other.getCarnumber()));
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
            result = prime * result + ((getChinesename() == null) ? 0 : getChinesename().hashCode());
            result = prime * result + ((getIdcard() == null) ? 0 : getIdcard().hashCode());
            result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode());
            result = prime * result + ((getMobile() == null) ? 0 : getMobile().hashCode());
            result = prime * result + ((getAddress() == null) ? 0 : getAddress().hashCode());
            result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode());
            result = prime * result + ((getBankcard() == null) ? 0 : getBankcard().hashCode());
            result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());
            result = prime * result + ((getCarnumber() == null) ? 0 : getCarnumber().hashCode());
            return result;
        }
    
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append(getClass().getSimpleName());
            sb.append(" [");
            sb.append("Hash = ").append(hashCode());
            sb.append(", id=").append(id);
            sb.append(", chinesename=").append(chinesename);
            sb.append(", idcard=").append(idcard);
            sb.append(", phone=").append(phone);
            sb.append(", mobile=").append(mobile);
            sb.append(", address=").append(address);
            sb.append(", email=").append(email);
            sb.append(", bankcard=").append(bankcard);
            sb.append(", password=").append(password);
            sb.append(", carnumber=").append(carnumber);
            sb.append(", serialVersionUID=").append(serialVersionUID);
            sb.append("]");
            return sb.toString();
        }
    }
  8. 脱敏测试
    脱敏前:
    {
    	"chinesename": "童心同萌",
    	"idcard": "111111",
    	"phone": "222222",
    	"mobile": "333333",
    	"address": "444444",
    	"email": "555555@qq.com",
    	"bankcard": "666666",
    	"password": "777777",
    	"carnumber": "888888"
    }
    
    注意:调用控制器接口向数据库插入数据

    脱敏后:
    {
        "id": 1614933945059004418,
        "chinesename": "童***",
        "idcard": "**1111",
        "phone": "**2222",
        "mobile": "333*33",
        "address": "444444",
        "email": "555***@qq.com",
        "bankcard": "666666**6666",
        "password": "******",
        "carnumber": "88***8"
    }
    
    注意:数据库存储内容为原始数据,查询时脱敏后得到的数据不再是原始数据,实现数据保护

  9. 自定义策略

    @Configuration
    public class SensitiveStrategyConfig {
    
        /**
         * 注入脱敏策略
         */
        @Bean
        public ISensitiveStrategy sensitiveStrategy() {
            return new SensitiveStrategy()
                    .addStrategy("strategyA", t -> t.toUpperCase().replace("A", "#"))
                    .addStrategy("strategyB", t -> t.toUpperCase().replace("B", "$"))
                    .addStrategy("strategyC", t -> t.toUpperCase().replace("C", "&"));
        }
    
    }
    
    注意:strategyA strategyB strategyC 为自定义脱敏策略,字段添加@FieldSensitive("strategyA")注解
    即可使用strategyA脱敏策略,该策略将原始数据转为大写后将所有"A"替换为"#",strategyB strategyC同理
        /**
         * chineseName
         */
        @FieldSensitive("strategyA")
        @TableField(value = "chineseName")
        private String chinesename;
    
        /**
         * idCard
         */
        @FieldSensitive("strategyB")
        @TableField(value = "idCard")
        private String idcard;
    
        /**
         * phone
         */
        @FieldSensitive("strategyC")
        @TableField(value = "phone")
        private String phone;

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

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

相关文章

熟悉Spring框架?Spring容器使用流程,注解 你真的会吗?(让你一下通透~)

目录 前言 一、ApplicationContext 和 BeanFactory 的区别 二、主要工作流程 三、开发步骤 3.1、创建Maven项目 3.2、创建Spring的核心配置文件 3.3、Spring注解 3.3.1、类注解 3.3.2、五大类注解的关系 3.3.3、方法注解 3.3.4、属性注入 3.3.5、五大注解关系图&am…

【03】FreeRTOS的任务创建(静态和动态)和删除

目录 1.任务创建和删除的API函数 1.1动态创建任务函数 1.1.1实现动态创建任务流程 1.1.2任务控制块结构成员介绍 1.2静态创建任务函数 1.2.1实现静态创建任务流程 1.3任务删除函数 1.3.1删除任务流程 2.任务创建和删除&#xff08;动态方法&#xff09; 2.1宏confi…

一文掌握项目估算工具及方法【管理有度13】

01为什么要做估算我们的业务方经常抱怨资源不足&#xff0c;团队需求的吞吐率太低&#xff0c;资源和需求量的不匹配是一个永恒的话题&#xff0c;解决方案应该不只是增加资源&#xff0c;增加了资源如果需求的输入量不能稳定保证&#xff0c;那资源就会处于持续浪费的状态当中…

项目管理:项目控制的三个基本原则

要记住项目控制是怎么回事&#xff0c;一个简单方法是思考PDA。PDA是指预防、检测和行动。让我们仔细看看项目控制的这些基本原则。 1、预防 就像你自己的健康一样&#xff0c;健康的秘诀是加强你的免疫系统&#xff0c;尽量减少与有害物的接触。换句话说&#xff0c;就是不…

谷歌账号被封怎么办?谷歌账号解封申诉步骤请收好!

谷歌账号有多重要&#xff1f;相信很多跨境人和社媒营销人都会深有感悟的&#xff0c;谷歌账号可以说是国外互联网的一个通行证&#xff0c;国外非常多的网站都是支持使用谷歌账号登录的。 谷歌账号对企业进军海外市场是非常重要的存在&#xff0c;然而谷歌账号一旦操作不当是很…

Go语言变量

Go语言变量 参考资料主要来源于菜鸟教程。 参考链接&#xff1a;https://blog.51cto.com/u_15230485/2821028 变量来源于数学&#xff0c;是计算机语言中能存储计算结果或能表示值抽象概念。 变量可以通过变量名访问。 Go语言变量名由字母、数字、下划线组成&#xff0c;其中首…

Vector和ArrayList对比

本文会对ArrayList和Vector进行分析&#xff0c;为什么会关注这两个类&#xff0c;主要是因为他们拥有相同的继承结构&#xff0c;接下来就来探索下这两个类实现和效率的异同。 继承结构 可以看到&#xff0c;Vector和ArrayList都实现了List和RandomAccess接口&#xff0c;都继…

C语言——常用字符串库函数的介绍

文章目录常用字符串库函数介绍1.1关于字符串简介1.2:[strlen库函数](https://legacy.cplusplus.com/reference/cstring/strlen/?kwstrlen)1.2.1strlen函数的功能1.2.2strlen函数的参数和返回类型1.2.3strlen函数使用注意事项1.2.4strlen的使用1.2.5模拟实现strlen函数1.3:[str…

喜讯!酷开科技荣获中国国际广告节三项殊荣!

近日&#xff0c;由中国广告协会主办的第29届中国国际广告节AD Fair媒企交易会在厦门国际会展中心隆重举行。其中备受瞩目的三大盛典&#xff1a;广告主金伙伴盛典、广告主盛典、媒企盛典&#xff0c;是广告业必不可少的荣誉殿堂&#xff0c;他们不仅是对中国广告传媒业各方主体…

【C++升级之路】第七篇:STL简介

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;从整体上对STL进行粗略介绍 &#x1f6a2;&#x1f6a2;作者简介&#xff1a;计算机海洋的新进船长一枚&…

GTD之初总结

思维导图 GTD&#xff1a;GTD是“Getting Things Done”的缩写&#xff0c;是由效率管理专家戴维艾伦&#xff08;David Allen&#xff09;开创的一套完整个人时间管理系统 既高效地处理工作事务&#xff0c;又能品味生活的快乐滋味&#xff0c;达到心如止水的轻松感 GTD工作…

docker中基础内容

docker中的核心概念 1、镜像&#xff1a; Image 定义&#xff1a;一个镜像就代表一个软件&#xff0c;比如&#xff1a;mysql 镜像、redis 镜像、es镜像等等2、容器&#xff1a; Container 定义&#xff1a;一个镜像运行一次就会生成一个容器&#xff0c;容器就是一个运行的软…

托普云农在创业板IPO过会:拟募资约3亿元,前三季度利润下滑8%

近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;浙江托普云农科技股份有限公司&#xff08;下称“托普云农”&#xff09;获得创业板上市委会议通过。据贝多财经了解&#xff0c;托普云农于2022年6月24日递交招股书并获得受理。 本次冲刺创业板上市&#xff0c;托普…

分享36个C源码,总有一款适合您

C源码 分享36个C源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1WTLgtQ2J5gfZdj-LMEYnEA?pwdnimr 提取码…

Swagger使用

SpringBoot继承Swagger <!--swagger依赖--> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency> <!--swagger ui--> <dependen…

列表元素的查找,插入和删除

1&#xff0c;查找列表元素&#xff1a; 语法格式&#xff1a;ls.index(x) 其中&#xff0c;ls是要进行元素查找操作对象&#xff0c;x为要查元素值&#xff0c;返回值是ls中第一个值为x的元素的位置。例如&#xff1a;ls[1,2,3,6]#创建一个列表 print&#xff08;ls值为6的元…

Linux操作系统进程状态Linux内核进程状态

目录 Linux操作系统进程状态 1. 新建 2. 运行 3. 阻塞 4. 挂起 Linux内核进程状态 进程状态查看 Linux操作系统进程状态 1. 新建 即字面意思&#xff0c;将进程资源(PCB)加载到内存,运行状态之前就是新建。 2. 运行 进程正在运行或者task_struct 结构体在队列中排队&…

leetcode 1813. 句子相似性 III【python3双指针的实现思路及过程整理】

题目 一个句子是由一些单词与它们之间的单个空格组成&#xff0c;且句子的开头和结尾没有多余空格。比方说&#xff0c;“Hello World”&#xff0c;“HELLO”&#xff0c;"hello world hello world"都是句子。每个单词都只包含大写和小写英文字母。 如果两个句子 s…

【数据结构】图的案例引入及类型定义

6.2 案例引入 六度空间理论 六度空间理论验证 6.3 图的类型定义 图的抽象数据类型定义如下 ADT Graph {数据对象V&#xff1a;具有相同特性的数据元素的集合&#xff0c;称为顶点集。数据关系R&#xff1a;R{VR}VR{<v,w>|<v,w>|v,w∈V ^ p(v,w),<v,w>表述…

WebStorage之浏览器的本地存储(结合案例)

目录前言一&#xff0c;WebStorage二&#xff0c;localStorage2.1 存储2.2 读取2.3 删除2.4 清除全部2.5 代码三&#xff0c;sessionStorage3.1 用法3.2 区别3.3 代码四&#xff0c;结合案例后记前言 浏览器的本地存储可以缓存一些信息在浏览器中&#xff0c;方便取用。在学习…