1.、编写序列化类
public class SensitiveSerializer extends JsonSerializer<String> implements ContextualSerializer {
private SensitiveEnum sensitiveEnum;
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(sensitiveEnum.desensitizer().apply(value));
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
SensitiveData annotation = property.getAnnotation(SensitiveData.class);
if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
this.sensitiveEnum = annotation.strategy();
return this;
}
return prov.findValueSerializer(property.getType(), property);
}
}
2、自定义注解,并指定序列化类为【SensitiveSerializer】
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveSerializer.class)
public @interface SensitiveData {
SensitiveEnum strategy();
}
3、自定义脱敏策略,可自行扩展
public enum SensitiveEnum {
/**
* 用户名
*/
USERNAME(s -> s.replaceAll("\\S*(\\S)", "***$1")),
/**
* 身份证
*/
ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),
/**
* 手机号
*/
PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
/**
* 地址
*/
ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****"));
private final Function<String, String> desensitizer;
SensitiveEnum(Function<String, String> desensitizer) {
this.desensitizer = desensitizer;
}
public Function<String, String> desensitizer() {
return desensitizer;
}
}
4、配置注解,指定脱敏字段【@SensitiveData(strategy = SensitiveEnum.USERNAME)】
public class SysUserQueryVO {
@ApiModelProperty("主键ID")
private Integer id;
@ApiModelProperty("主键ID")
private String username;
@ApiModelProperty("是否启用(0启用,1禁用)")
//@DictLabel(dictType = SysDictTypeEnum.COMMON_ENABLE)
@EmbedTrans(dicMetohd = SysDictTypeEnum.COMMON_ENABLE)
private Integer enable;
@ApiModelProperty(value = "姓名")
@SensitiveData(strategy = SensitiveEnum.USERNAME)
private String nickname;
@ApiModelProperty(value = "身份证")
@SensitiveData(strategy = SensitiveEnum.ID_CARD)
private String idCardNum;
@ApiModelProperty(value = "联系电话")
private String mobile;
@ApiModelProperty(value = "门店id")
private Integer storeId;
}