在SpringBoot中实现数据脱敏通常有以下几种方式:
- 自定义注解:创建一个注解用于标记需要进行脱敏的字段。
- 拦截器:在请求处理的早期阶段拦截数据,进行脱敏处理。
- AOP(面向切面编程):通过AOP可以在不修改原始代码的情况下增加数据脱敏的逻辑。
以下是使用自定义注解和AOP实现数据脱敏的简单示例:
自定义注解(SensitiveData.java):
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SensitiveData {
SensitiveType type() default SensitiveType.DEFAULT;
}
public enum SensitiveType {
DEFAULT,
PHONE,
ID_CARD,
EMAIL
}
AOP处理数据脱敏(SensitiveAspect.java):
@Aspect
@Component
public class SensitiveAspect {
@Around("@annotation(sensitiveData)")
public Object handleSensitiveData(ProceedingJoinPoint joinPoint, SensitiveData sensitiveData) throws Throwable {
// 获取注解指定的脱敏类型
SensitiveType type = sensitiveData.type();
// 获取注解作用的字段值
Object fieldValue = getFieldValue(joinPoint);
// 根据脱敏类型进行脱敏处理
Object desensitizedValue = desensitize(type, fieldValue);
// 返回处理后的值
return desensitizedValue;
}
private Object getFieldValue(ProceedingJoinPoint joinPoint) {
// 获取字段值的逻辑...
}
private Object desensitize(SensitiveType type, Object fieldValue) {
// 脱敏处理逻辑...
switch (type) {
case PHONE:
// 手机号脱敏处理
break;
case ID_CARD:
// 身份证号脱敏处理
break;
case EMAIL:
// 邮箱脱敏处理
break;
default:
// 默认脱敏处理
break;
}
return fieldValue; // 返回处理后的值
}
}
在实体类的字段上使用@SensitiveData
注解:
public class User {
// ...
@SensitiveData(type = SensitiveType.PHONE)
private String phoneNumber;
@SensitiveData(type = SensitiveType.ID_CARD)
private String idCard;
@SensitiveData(type = SensitiveType.EMAIL)
private String email;
// ...
}
在application.properties
或application.yml
中添加AOP依赖:
# application.properties
spring.aop.auto=true
spring.aop.proxy-target-class=true
或者
# application.yml
spri