同步操作将从 lzhpo/sensitive-spring-boot-starter 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
sensitive-spring-boot-starter也支持SpringBoot3
3.0.0及以上版本的sensitive-spring-boot-starter只针对使用SpringBoot3用户,SpringBoot2用户请使用低于3.0.0版本的sensitive-spring-boot-starter,两者功能不受影响,均会同步更新!
依赖已发布至Maven中央仓库,可直接引入依赖。
Maven:
<dependency>
<groupId>com.lzhpo</groupId>
<artifactId>sensitive-spring-boot-starter</artifactId>
<version>${latest-version}</version>
</dependency>
Gradle:
implementation 'com.lzhpo:sensitive-spring-boot-starter:${latest-version}'
@Sensitive
注解配置脱敏规则@Sensitive
注解说明:
strategy
:脱敏策略,支持12种脱敏策略。replacer
:脱敏策略的替换符,默认脱敏替换符为星号*
,可以配置为任意字符。
比如:配置为#
@Sensitive(strategy = SensitiveStrategy.CHINESE_NAME, replacer = '#')
private String name;
以下数据均为随意构造的测试数据,如有相同,纯属巧合。
只显示第一个汉字,其他隐藏为2个星号。
@Sensitive(strategy = SensitiveStrategy.CHINESE_NAME)
private String name;
比如:刘子豪
脱敏之后为刘**
。
保留前1位和后2位。
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String idCard;
比如:530321199204074611
脱敏之后为5***************11
。
保留前4位和后2位。
@Sensitive(strategy = SensitiveStrategy.FIXED_PHONE)
private String fixedPhone;
比如:01086551122
脱敏之后为0108*****22
。
保留前3位和后4位。
@Sensitive(strategy = SensitiveStrategy.MOBILE_PHONE)
private String mobilePhone;
比如:13248765917
脱敏之后为132****5917
。
只显示到地区,不显示详细地址,地址长度减去8即为前缀保留的长度,后缀均用星号代替。
@Sensitive(strategy = SensitiveStrategy.ADDRESS)
private String address;
比如:广州市天河区幸福小区102号
脱敏之后为广州市天河区********
。
邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示。
@Sensitive(strategy = SensitiveStrategy.EMAIL)
private String email;
比如:example@gmail.com
脱敏之后为e******@gmail.com
。
全部字符都用星号*
代替。
@Sensitive(strategy = SensitiveStrategy.PASSWORD)
private String password;
比如:123456
脱敏之后为******
。
车牌中间用星号*
代替。
@Sensitive(strategy = SensitiveStrategy.CAR_LICENSE)
private String carLicense;
比如:粤A66666
脱敏之后为粤A6***6
。
保留前4位和后4位,中间的使用星号*
代替,且中间的从第1位起,每隔4位添加一个空格用来美化。
@Sensitive(strategy = SensitiveStrategy.BANK_CARD)
private String bankCard;
例如:9988002866797031
脱敏之后为9988 **** **** 7031
。
当前支持三种风格的自定义脱敏策略:
使用@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_KEEP_LENGTH)
配合@SensitiveKeepLength
一起使用。
@SensitiveFilterWords
注解:
preKeep
是字符串前置保留字符个数。postKeep
是字符串后置保留字符个数。举个例子:name
前后都只保留1个字符。
@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_KEEP_LENGTH)
@SensitiveKeepLength(preKeep = 1, postKeep = 1)
private String name;
如果name
为1234
,脱敏之后就是1**4
。
使用@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_FILTER_WORDS)
配合@SensitiveFilterWords
一起使用。
@SensitiveFilterWords
注解:定义敏感字符。
举个例子:脏话关键字脱敏。
@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_FILTER_WORDS)
@SensitiveFilterWords({"他妈的", "去你大爷", "卧槽", "草泥马", "废物"})
private String description;
如果description
的值为卧槽,他妈的,我去你大爷的,草泥马
,脱敏之后就是**,***,我****的,***
。
Handler脱敏策略完全由开发者进行处理,不受@Sensitive
注解上的replacer
脱敏替换符影响。
使用@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_HANDLER)
配合@SensitiveHandler
一起使用。
@SensitiveHandler
注解:表示处理脱敏的Handler。
例如:将name
字段都设置为@#@
。
@Sensitive(strategy = SensitiveStrategy.CUSTOMIZE_HANDLER)
@SensitiveHandler(FaceCustomizeSensitiveHandler.class)
private String name;
public class FaceCustomizeSensitiveHandler implements CustomizeSensitiveHandler {
@Override
public String customize(SensitiveWrapper sensitiveWrapper) {
// 字段
Field field = sensitiveWrapper.getField();
// 字段归属的对象
Class<?> objectClass = field.getDeclaringClass();
// 字段上的注解
Annotation[] annotations = field.getAnnotations();
// 字段值
String fieldValue = sensitiveWrapper.getFieldValue();
// 注解信息
Sensitive sensitive = sensitiveWrapper.getSensitive();
return "@#@";
}
}
可以看到,提供了含有@Sensitive
注解的字段、字段值、字段归属的对象、注解的信息等等供开发者定制。
@IgnoreSensitive
注解标注在controller上可忽略脱敏@IgnoreSensitive
表示此类下所有接口都忽略脱敏此controller下的所有接口都将忽略脱敏。
@RestController
@IgnoreSensitive
@RequestMapping("/ignore")
public class NoSensitiveController {
@GetMapping("sample3")
public ResponseEntity<SampleJavaBean> sample3() {
return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());
}
@GetMapping("sample4")
public ResponseEntity<SampleJavaBean> sample4() {
return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());
}
}
@IgnoreSensitive
表示此接口忽略脱敏@RestController
@RequestMapping("/")
public class SensitiveController {
@GetMapping("sample1")
public ResponseEntity<SampleJavaBean> sample1() {
return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());
}
@IgnoreSensitive
@GetMapping("ignore/sample2")
public ResponseEntity<SampleJavaBean> sample2() {
return ResponseEntity.ok(SampleJavaBeanMock.sampleJavaBean());
}
}
sample2将忽略SampleJavaBean
对象的字段脱敏,sample1不影响。
@Builder
/@SuperBuilder
注解、实体类多层嵌套问题需要数据脱敏的实体类以及嵌套类都应提供对应成员变量的get方法,否则JSON组件无法获取到嵌套的成员变量进行脱敏!
错误示范:嵌套对象单独使用一个@Builder
/@SuperBuilder
正确示范:如果需要使用到@Builder
/@SuperBuilder
,那么需要配合@Data
或@Getter
一起使用。
例如:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SensitiveEntity {
@Sensitive(strategy = SensitiveStrategy.CHINESE_NAME)
private String name;
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String idCard;
}
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.x.x/2.x.x</version>
</dependency>
FastJsonHttpMessageConverter
声明为Bean即可,sensitive-spring-boot-starter
会自动注入相关逻辑。
@Bean
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
return new FastJsonHttpMessageConverter();
}
移除此maven依赖即可
微信 | 公众号 |
---|---|
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。