1.Desensitized
/**
* 脱敏注解
* @author myc
* @date 2022/10/9 16:14
*/
@Documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizationSerialize.class)
public @interface Desensitized {
/**
* 脱敏规则
*/
DesensitizeRuleEnums rule();
}
2.DesensitizeRuleEnums
import cn.hutool.core.util.DesensitizedUtil;
import lombok.AllArgsConstructor;
import java.util.function.Function;
/**
* @author myc
* @date 2022/10/9 16:24
*/
@AllArgsConstructor
public enum DesensitizeRuleEnums {
/**
* 用户id脱敏
*/
USER_ID(s -> String.valueOf(DesensitizedUtil.userId())),
/**
* 中文姓名脱敏
*/
CHINESE_NAME(DesensitizedUtil::chineseName),
/**
* 身份证脱敏
*/
ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)),
/**
* 固定电话
*/
FIXED_PHONE(DesensitizedUtil::fixedPhone),
/**
* 手机号脱敏
*/
MOBILE_PHONE(DesensitizedUtil::mobilePhone),
/**
* 地址脱敏
*/
ADDRESS(s -> DesensitizedUtil.address(s, 8)),
/**
* 电子邮箱脱敏
*/
EMAIL(DesensitizedUtil::email),
/**
* 密码脱敏
*/
PASSWORD(DesensitizedUtil::password),
/**
* 中国车牌脱敏
*/
CAR_LICENSE(DesensitizedUtil::carLicense),
/**
* 银行卡脱敏
*/
BANK_CARD(DesensitizedUtil::bankCard);
/**
* 可自行添加其他脱敏策略
*/
private final Function<String, String> desensitize;
public Function<String, String> desensitize() {
return desensitize;
}
}
3.DesensitizationSerialize
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 lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.io.IOException;
/**
* @author myc
* @date 2022/10/9 17:26
*/
@NoArgsConstructor
@AllArgsConstructor
public class DesensitizationSerialize extends JsonSerializer<String> implements ContextualSerializer {
private DesensitizeRuleEnums desensitizeRuleEnums;
@Override
public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
if (beanProperty != null){
if (beanProperty.getType().getRawClass().equals(String.class)){
Desensitized desensitized = beanProperty.getAnnotation(Desensitized.class);
if (desensitized == null){
return serializerProvider.findKeySerializer(beanProperty.getType(), beanProperty);
}else {
return new DesensitizationSerialize(desensitized.rule());
}
}
return serializerProvider.findKeySerializer(beanProperty.getType(), beanProperty);
}
return serializerProvider.findNullValueSerializer(null);
}
@Override
public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(desensitizeRuleEnums.desensitize().apply(s));
}
}
4.实体类
@Desensitized(rule = DesensitizeRuleEnums.MOBILE_PHONE)
@ApiModelProperty("手机号")
private String phone;