This commit is contained in:
zweiandlen 2024-10-21 16:06:58 +08:00
commit baa1152da1
Signed by: zweiandlen
GPG Key ID: A6A3880FDDD83652
7 changed files with 266 additions and 0 deletions

50
.gitignore vendored Normal file
View File

@ -0,0 +1,50 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### Vue.js ###
.DS_Store
node_modules/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
tests/**/coverage/
# Editor directories and files
.vscode/
.mvn/
/src/main/resources/static/
/files/
*.suo
*.ntvs*
*.njsproj
*.sln

7
README.md Normal file
View File

@ -0,0 +1,7 @@
# sensitive
适用于 jackson 的脱敏处理
## 条件脱敏
实现 DesensitizedFilter 接口,定义脱敏条件。

55
pom.xml Normal file
View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ltd.llvy</groupId>
<artifactId>sensitive</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.17.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-core -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.32</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>gitea</id>
<url>https://www.llvy.ltd/api/packages/llvy.ltd/maven</url>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>gitea</id>
<url>https://www.llvy.ltd/api/packages/llvy.ltd/maven</url>
</repository>
<snapshotRepository>
<id>gitea</id>
<url>https://www.llvy.ltd/api/packages/llvy.ltd/maven</url>
</snapshotRepository>
</distributionManagement>
</project>

View File

@ -0,0 +1,39 @@
package ltd.llvy.sensitive.annotation;
import cn.hutool.core.util.DesensitizedUtil;
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;
import ltd.llvy.sensitive.filter.impl.DefaultDesensitizedFilter;
import ltd.llvy.sensitive.support.JsonDesensitizationSerializer;
/**
* (Desensitization) 脱敏注解
*
* @author zweiandlen
* @since 2024/9/27 14:32
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@JacksonAnnotationsInside
@JsonSerialize(using = JsonDesensitizationSerializer.class)
public @interface Desensitization {
/**
* 脱敏的类型比如手机号邮箱.
*
* @return 脱敏类型
*/
DesensitizedUtil.DesensitizedType type() default
DesensitizedUtil.DesensitizedType.CLEAR_TO_EMPTY;
/**
* 过滤的方法自定义符合条件的脱敏数据.
*
* @return 过滤方法
*/
Class<?> filter() default DefaultDesensitizedFilter.class;
}

View File

@ -0,0 +1,17 @@
package ltd.llvy.sensitive.filter;
/**
* (DesensitizedFilter)
*
* @author zweiandlen
* @since 2024/10/21 14:33
*/
public interface DesensitizedFilter {
/**
* 符合条件的明文不符合的脱敏
*
* @return 布尔值
*/
boolean doFilter();
}

View File

@ -0,0 +1,16 @@
package ltd.llvy.sensitive.filter.impl;
import ltd.llvy.sensitive.filter.DesensitizedFilter;
/**
* (DefaultDesensitizedFilter)
*
* @author zweiandlen
* @since 2024/10/21 15:10
*/
public class DefaultDesensitizedFilter implements DesensitizedFilter {
@Override
public boolean doFilter() {
return false;
}
}

View File

@ -0,0 +1,82 @@
package ltd.llvy.sensitive.support;
import cn.hutool.core.util.DesensitizedUtil;
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.lang.reflect.InvocationTargetException;
import java.util.Objects;
import ltd.llvy.sensitive.annotation.Desensitization;
import ltd.llvy.sensitive.filter.DesensitizedFilter;
/**
* (JsonDesensitizationSerializer)
*
* @author zweiandlen
* @since 2024/9/27 14:35
*/
public class JsonDesensitizationSerializer extends JsonSerializer<String>
implements ContextualSerializer {
/** 脱敏字段类型 */
private DesensitizedUtil.DesensitizedType type;
/** 过滤方法. */
private Class<?> clazz;
public JsonDesensitizationSerializer() {}
public JsonDesensitizationSerializer(DesensitizedUtil.DesensitizedType type, Class<?> clazz) {
this.type = type;
this.clazz = clazz;
}
@Override
public void serialize(
String plaintext, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
String desensitize = DesensitizedUtil.desensitized(plaintext, type);
DesensitizedFilter filter = null;
try {
filter = (DesensitizedFilter) clazz.getConstructor().newInstance();
} catch (InstantiationException
| IllegalAccessException
| InvocationTargetException
| NoSuchMethodException e) {
throw new RuntimeException(e);
}
// 符合过滤条件的显示明文不符合的脱敏
if (filter.doFilter()) {
jsonGenerator.writeString(plaintext);
} else {
jsonGenerator.writeString(desensitize);
}
}
@Override
public JsonSerializer<?> createContextual(
SerializerProvider serializerProvider, BeanProperty property) throws JsonMappingException {
if (property != null) {
// 判断是不是String类型的参数
if (Objects.equals(property.getType().getRawClass(), String.class)) {
// 获取属性上面的注解
Desensitization annotation = property.getAnnotation(Desensitization.class);
if (annotation == null) {
annotation = property.getContextAnnotation(Desensitization.class);
}
if (annotation != null) {
// 给当前属性赋值
return new JsonDesensitizationSerializer(annotation.type(), annotation.filter());
}
}
return serializerProvider.findValueSerializer(property.getType(), property);
} else {
return serializerProvider.findNullValueSerializer(null);
}
}
}