Spring Boot中的数据脱敏处理
在Spring Boot中实现数据脱敏处理,可以通过自定义注解和AOP(面向切面编程)来实现。以下是一个简单的例子:
- 定义脱敏注解:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface Desensitize {
DesensitizeType type() default DesensitizeType.PHONE;
}
public enum DesensitizeType {
PHONE, // 手机号
ID_CARD, // 身份证号
EMAIL, // 邮箱
USERNAME // 用户名
// 可以根据需要扩展其他类型
}
- 创建一个AOP切面处理脱敏:
@Aspect
@Component
public class DesensitizeAspect {
@Around("@annotation(desensitize)")
public Object desensitizeData(ProceedingJoinPoint joinPoint, Desensitize desensitize) throws Throwable {
Object result = joinPoint.proceed();
if (result instanceof String) {
result = desensitize((String) result, desensitize.type());
} else if (result instanceof Collection<?>) {
Collection<?> collection = (Collection<?>) result;
collection.forEach(item -> {
if (item instanceof String) {
collection.add(desensitize((String) item, desensitize.type()));
}
});
}
// 其他类型的处理...
return result;
}
private String desensitize(String data, DesensitizeType type) {
switch (type) {
case PHONE:
return desensitizePhone(data);
case ID_CARD:
return desensitizeIdCard(data);
case EMAIL:
return desensitizeEmail(data);
case USERNAME:
return desensitizeUsername(data);
default:
return data;
}
}
private String desensitizePhone(String phone) {
// 手机号脱敏逻辑
return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
private String desensitizeIdCard(String idCard) {
// 身份证号脱敏逻辑
return idCard.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1*****$2");
}
private String desensitizeEmail(String email) {
// 邮箱脱敏逻辑
return email.replaceAll("(\\w?)\\w*(?=@)", "$1***");
}
private String desensitizeUsername(String username) {
// 用户名脱敏逻辑
if (username.length() > 2) {
return username.substring(0, 1) + "**";
}
return username;
}
}
- 使用脱敏注解:
public class UserController {
@GetMapping("/user/info")
@Desensi
评论已关闭