自定义注意实现敏感信息字段脱敏
自定义注意实现敏感信息字段脱敏
- 欢迎并感谢浏览卢小龙的本篇文章
- 1.使用场景
- 2.实际使用
- 2.1 开发注解
- 2.2 脱敏策略枚举
- 2.3 序列化切面
- 2.4 脱敏字段注解使用
欢迎并感谢浏览卢小龙的本篇文章
你好!亲爱的读者,本篇文章将主要记录本人在开发中使用自定义注解完成对用户个人信息中如手机号、身份中号等敏感信息的脱敏战士使用,方便自己的学习历程记录以及复习参考,若有言错之处,请各位给予指点.
1.使用场景
在实际的开发任务中,页面上呈现的客户信息中携带者客户的手机号、证件号、实际姓名等诸多敏感类信息,这些敏感类信息应该进行脱敏展示,而无论是在SQL中使用脱敏还是在代码中利用Util工具类去实现脱敏,都非常的定制化。于是笔者使用自定义注解,只需要在VO中对字段打上注解即可完成脱敏。
2.实际使用
2.1 开发注解
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.haiercash.custservice.common.constant.enums.SensitiveStrategyEnum;
import com.haiercash.custservice.common.support.SensitiveJsonSerializer;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/************************************************* @Description: 敏感信息字段脱敏注解* @Author: xiaolong* @Date: 2022/11/29*************************************************/@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {SensitiveStrategyEnum strategy();
}
2.2 脱敏策略枚举
import java.util.function.Function;/************************************************* @Description: 具体字段脱敏策略* @Author: xiaolong* @Date: 2022/11/29*************************************************/
public enum SensitiveStrategyEnum {USER_NAME(s -> s.replaceAll("(\\S)\\S(\\S)", "$1*$2")),CERT_NO(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));private final Function<String, String> desensitizer;SensitiveStrategyEnum(Function<String, String> desensitizer) {this.desensitizer = desensitizer;}public Function<String, String> desensitizer(){return this.desensitizer;}
}
2.3 序列化切面
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 com.haiercash.custservice.common.annotation.Sensitive;
import com.haiercash.custservice.common.constant.enums.SensitiveStrategyEnum;import java.io.IOException;
import java.util.Objects;/************************************************* @Description: 数据脱敏序列化* @Author: xiaolong* @Date: 2022/11/29*************************************************/public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {private SensitiveStrategyEnum sensitiveStrategy;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeString(sensitiveStrategy.desensitizer().apply(value));}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {Sensitive annotation = property.getAnnotation(Sensitive.class);if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())){this.sensitiveStrategy = annotation.strategy();return this;}return prov.findValueSerializer(property.getType(), property);}
}
2.4 脱敏字段注解使用
/************************************************* @Description: 客户列表-返回参数* @Author: xiaolong* @Date: 2022/11/22*************************************************/
@Data
@Accessors(chain = true)
@ApiModel(value = "CustomerInfoListVO", description = "客户列表-返回参数")
public class CustomerInfoListVO implements Serializable {@ApiModelProperty(value = "客户编号", position = 1)private String custNo;@ApiModelProperty(value = "客户姓名", position = 2)private String custName;@ApiModelProperty(value = "性别", position = 3)private String gender;@ApiModelProperty(value = "手机号码", position = 4)@Sensitive(strategy = SensitiveStrategyEnum.PHONE)private String mobile;@ApiModelProperty(value = "证件号", position = 5)@Sensitive(strategy = SensitiveStrategyEnum.CERT_NO)private String certNo;@ApiModelProperty(value = "客户状态", position = 6)private String isValid;@ApiModelProperty(value = "客户来源", position = 7)private String dataFrom;@ApiModelProperty(value = "注册id", position = 8)private String userId;@ApiModelProperty(value = "登录账号", position = 9)@Sensitive(strategy = SensitiveStrategyEnum.PHONE)private String login;@ApiModelProperty(value = "生日", position = 10)private String birthDt;}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
