【SpringBoot组件】基于SpringMVC注解 使用AOP对http接口请求响应参数加解密 数据脱敏 @Security @Sensitive

本文主要是介绍【SpringBoot组件】基于SpringMVC注解 使用AOP对http接口请求响应参数加解密 数据脱敏 @Security @Sensitive,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址

BY Jason

文章目录

  • 原文地址
  • 开源地址
  • 使用说明
    • 1.介绍
    • 2.导入依赖
    • 3.项目配置
    • 4.响应数据脱敏`@Sensitive`
      • 4.1实体类字段使用`@Sensitive`注解
      • 4.2接口方法上使用`@Sensitive`注解
    • 5.响应请求参数加解密`@Security`
      • 5.1实体类字段使用`@Security`注解
      • 5.2接口方法中使用`@Security`注解

开源地址

  • Gitee:https://gitee.com/feizhaiyou/encrypt-spring-boot-starter

使用说明

1.介绍

对SpringWeb项目中SpringMVC注解(@RequestMapping@GetMapping@PostMapping@PutMapping@DeleteMapping)的接口参数进行脱敏与加解密,仅限于Http请求中字符串类型的参数数据生效,可进行充分扩展,可自进行定义脱敏、加解密等。

2.导入依赖

  • Maven:

    依赖已发布至Maven中央仓库,可直接引入依赖。

    <dependency><groupId>com.feizhaiyou.encrypt</groupId><artifactId>encrypt-spring-boot-starter</artifactId><version>${latest-version}</version>
    </dependency>
    
  • 本地:

    git拉取代码到本地,执行mvn install(选择profilelocal,例如:mvn clean install -Plocal)打包下载到本地Maven仓库,项目maven pom引入

    <dependency><groupId>com.feizhaiyou.encrypt</groupId><artifactId>encrypt-spring-boot-starter</artifactId><version>1.0.0</version>
    </dependency>
    

3.项目配置

对称加密:AES 密钥请自行生成

fzy:security:enable: true	#是否启动脱敏与加密,默认truemode: base64	#加密后的编码模式:base64、hex,默认base64max-deep: 5	#参数字段递归深度,默认5type: AES	#加密方式:AES、RSA,默认AESsecret: +6cuvzvyrFZpRG9pf3r7eQ==	#AES加密密钥 密钥请自行生成class-package:	#脱敏与加解密实体类所在包 支持包前缀和正则匹配- com.feizhaiyou.test.entitycharset: UTF-8	#字符集

非对称加密:RSA privateKey与publicKey请自行生成

fzy:security:enable: truemode: hexmax-deep: 5type: RSAclass-package:- com.feizhaiyou.test.entitycharset: UTF-8public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQwb536Gb2eZ60H/4VQRJUpod0M04yCR6IaEdgAbBACWvc5E2s7gCipO9IQB5tiU08JSQ2Mmfg88uGffK6z5YcKJ/CNWByiNHL3B2GzsgMMBh2a5Dba+KqA3ZFkeXhkw8htej18mM4Xw1KGytAni7sypzjynC+4/m7FcewB6BBxQIDAQABprivate-key: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJDBvnfoZvZ5nrQf/hVBElSmh3QzTjIJHohoR2ABsEAJa9zkTazuAKKk70hAHm2JTTwlJDYyZ+Dzy4Z98rrPlhwon8I1YHKI0cvcHYbOyAwwGHZrkNtr4qoDdkWR5eGTDyG16PXyYzhfDUobK0CeLuzKnOPKcL7j+bsVx7AHoEHFAgMBAAECgYBC6av3lW/ywuk/bgJvJLMqegfnCMg+jMSWXU2Q7XbhQvmfE9Fr/GBCzmblSO5Hx83x3WFNxCMMcuVDd/i5rbc+/fKoYyEhuOI91bHRxWR2M1VkNAZpUMeccGM/g15/p0P4pNEFYEaXkUZ170Je8aaECmr8v24ukvGlKFE38RuWgQJBANZCIkBxtY3H3CnT4LXX8NaJlWh7SpSZJsazwblDbubCMBJ+3qSaKxCE9v3d8F9QVPvZKgwd7uWIXHtcDygigVUCQQCs9U8NpV0VgZKbJzEuxaelpmi7eCe02hc5C1NVxQ14vRmV8na//GYOI6s0fNZjkPPGdRvmsTRpDYAeR3U/qX6xAkA+aed2ZGlh0s2Uta7o6e2zYULPu9Ke9Poxud197WHaAMlmKeULiAlxd3pHu6Yw7cLD1qAEBZg47v8ZxFh59Ys9AkEAjk4fxxiB6An+OA4dF2ClOVQb4/NOqCyw4syAupcxKGBeRtOCBSCET6nlWYBFXRKMoIMGe97dQnpLKZ6dx82LYQJBAJADjI2XGtg5HlgIzOLMMsTJ4+3OqCiJLoNAkmozckSQveyuh0Jh0Vvs1nTdfR1DMbsrIR2Me/ugPXzVvtEpU80=

4.响应数据脱敏@Sensitive

在实体类属性或者接口方法(针对直接响应字符串的情况)上使用@Sensitive注解即可。

注解属性说明:

参数名类型默认值说明
requiredbooleantrue是否开启字段加密,默认开启
typeStringcom.feizhaiyou.encrypt.constants.SensitiveType.DEFUALT脱敏参数类型

注意:@Sensitive注解必须用在字符串类型的参数字段或接口返回类型为字符串的接口方法上。

4.1实体类字段使用@Sensitive注解

package com.feizhaiyou.test.entity;import com.feizhaiyou.encrypt.annotation.Sensitive;
import com.feizhaiyou.encrypt.constants.SensitiveType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** @author ls* @since 2023-07-28*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {private String id;@Sensitive(type = SensitiveType.CHINESE_NAME)private String name;@Sensitive(type = SensitiveType.ID_CARD)private String idCard;@Sensitive(type = SensitiveType.EMAIL)private String email;@Sensitive(type = SensitiveType.MOBILE_PHONE)private String phone;private List<Address> addressList;
}
package com.feizhaiyou.test.entity;import com.feizhaiyou.encrypt.annotation.Sensitive;
import com.feizhaiyou.encrypt.constants.SensitiveType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author ls* @since 2023-07-28*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address {private String id;@Sensitive(type = SensitiveType.ADDRESS)private String address;private String areaCode;
}

Controller

package com.feizhaiyou.test.controller;import com.feizhaiyou.encrypt.annotation.Sensitive;
import com.feizhaiyou.test.entity.Address;
import com.feizhaiyou.test.entity.Result;
import com.feizhaiyou.test.entity.User;
import org.springframework.web.bind.annotation.*;import java.util.Collections;
import java.util.UUID;/*** @author ls* @since 2023-07-28*/
@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/get/{id}")public Result get(@PathVariable("id") String id) {User user = User.builder().id(id).idCard("110222199703036666").email("243607654@qq.com").name("热巴").phone("13939393939").addressList(Arrays.asList(Address.builder().address("北京市东城区长安街").areaCode("100000").id(UUID.randomUUID().toString()).build())).build();return Result.OK(user);}
}

PostMan调用测试:

4.2接口方法上使用@Sensitive注解

Controller

package com.feizhaiyou.test.controller;import com.feizhaiyou.encrypt.annotation.Sensitive;
import com.feizhaiyou.test.entity.Address;
import com.feizhaiyou.test.entity.Result;
import com.feizhaiyou.test.entity.User;
import org.springframework.web.bind.annotation.*;import java.util.Collections;
import java.util.UUID;/*** @author ls* @since 2023-07-21*/
@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/getAddress")@Sensitivepublic String getAddress() {return "北京市东城区长安街";}}

PostMan调用测试:

5.响应请求参数加解密@Security

在实体类属性或者接口方法(针对直接响应字符串的情况)上使用@Security注解即可。

注解属性说明:

参数名类型默认值说明
encryptbooleantrue是否对响应加密,默认开启
decryptbooleantrue是否对请求解密,默认开启

注意:@Security注解必须用在字符串类型的参数(实体类属性或方法参数)或接口返回类型为字符串的接口方法上。

5.1实体类字段使用@Security注解

package com.feizhaiyou.test.entity;import com.feizhaiyou.encrypt.annotation.Security;
import com.feizhaiyou.encrypt.annotation.Sensitive;
import com.feizhaiyou.encrypt.constants.SensitiveType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {private String id;// name 即加密又解密@Securityprivate String name;// idCard 不进行解密只加密@Security(decrypt = false)private String idCard;// email 不进行加密只解密@Security(encrypt = false)private String email;private String phone;private List<Address> addressList;
}
package com.feizhaiyou.test.entity;import com.feizhaiyou.encrypt.annotation.Security;
import com.feizhaiyou.encrypt.annotation.Sensitive;
import com.feizhaiyou.encrypt.constants.SensitiveType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author ls* @since 2023-07-28*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address {private String id;@Securityprivate String address;private String areaCode;
}

Controller

    @PostMapping("/post/{id}")public Result get(@PathVariable("id") String id, @RequestBody User user) {System.out.println("id = " + id + ", user = " + user);return Result.OK(user);}

PostMan调用测试:

控制台输出:

5.2接口方法中使用@Security注解

Controller

    @GetMapping("/getEmail")@Securitypublic String getEmail(@Security String name) {System.out.println("name = " + name);return "243607654@qq.com";}

PostMan调用测试:

控制台输出:

说明:

用在方法上,可以对接口响应的字符串进行加密

用在参数中,可以对接口请求参数的字符串进行解密

这篇关于【SpringBoot组件】基于SpringMVC注解 使用AOP对http接口请求响应参数加解密 数据脱敏 @Security @Sensitive的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395301

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——