java注解方式實現數據脫敏


使用注解方式結合Jackson實現數據脫敏

轉自 https://mp.weixin.qq.com/s/GmELzTYIwYAIpTVRyCh9mw

最后效果

 

思路;  1.自定義脫敏注解   2.自定義脫敏邏輯   3.具體字段脫敏策略

 

1.自定義脫敏注解     標注在實體類 具體 需要脫敏 字段上

其中用到Jackson的兩個注解, 並標明使用我們自定義脫敏策略即序列化后脫敏

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
    SensitiveStrategy strategy();
}

 標注實體類字段上

@TableName(value ="t_user")
@Data
public class User implements Serializable {

        @TableId(type = IdType.AUTO)
        private Integer id;

        /**
         * 真實姓名
         */
        @Sensitive(strategy = SensitiveStrategy.USERNAME)
        private String realName;
        /**
         * 地址
         */
        @Sensitive(strategy = SensitiveStrategy.ADDRESS)
        private String address;
        /**
         * 電話號碼
         */
        @Sensitive(strategy = SensitiveStrategy.PHONE)
        private String phoneNumber;
        /**
         * 身份證號碼
         */
        @Sensitive(strategy = SensitiveStrategy.ID_CARD)
        private String idCard;


    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
User

 

2.自定義脫敏邏輯      數據json化才實現脫敏

數據庫查詢的數據可以繼續進行業務邏輯

 

 

返回給前端json數據時才進行脫敏

 

 借助Jackson類和接口實現序列化才脫敏

public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
    private SensitiveStrategy strategy;

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
           gen.writeString(strategy.desensitizer().apply(value));
    }

    @Override
    public 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.strategy = annotation.strategy();
                return this;
            }
            return prov.findValueSerializer(property.getType(), property);

    }
}

 

3.具體字段脫敏策略     注解時使用對應字段的策略

public enum SensitiveStrategy {
    /**
     * Username sensitive strategy.
     */
    USERNAME(s -> s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")),
    /**
     * Id card sensitive type.
     */
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),
    /**
     * Phone sensitive type.
     */
    PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
    /**
     * Address sensitive type.
     */
    ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****"));


    private final Function<String, String> desensitizer;

    SensitiveStrategy(Function<String, String> desensitizer) {
        this.desensitizer = desensitizer;
    }

    public Function<String, String> desensitizer() {
        return desensitizer;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM