如何在logback-spring.xml中掩盖敏感数据USI usi ustobjectMapper

发布于 2025-01-18 13:59:18 字数 4827 浏览 4 评论 0原文

我编写了 @Mask 注释来屏蔽日志中的敏感信息。当我使用自定义 JacksonAnnotationIntrospector 和 ObjectMapper 记录数据时,它工作正常。我想在 logback-spring.xml 中使用它,以便任何用 @Mask 注释注释的字段都应该在日志中被屏蔽。有意见怎么办?

下面是课程。

Mask.java

package com.mask;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Mask {
    String value() default "XXX-DEFAULT MASK FORMAT-XXX";
}

MaskStringValueSerializer.java

package com.mask;

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.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;

public class MaskStringValueSerializer extends StdSerializer<String> implements ContextualSerializer {
    private Mask annot;

    public MaskStringValueSerializer() {
        super(String.class);
    }

    public MaskStringValueSerializer(Mask logMaskAnnotation) {
        super(String.class);
        this.annot = logMaskAnnotation;
    }

    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (annot != null && s != null && !s.isEmpty()) {
            jsonGenerator.writeString(annot.value());
        } else {
            jsonGenerator.writeString(s);
        }
    }

    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        Mask annot = null;
        if (beanProperty != null) {
            annot = beanProperty.getAnnotation(Mask.class);
        }
        return new MaskStringValueSerializer(annot);

    }
}

MaskAnnotationIntrospector.java

package com.mask;

import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;

public class MaskAnnotationIntrospector extends JacksonAnnotationIntrospector {

    @Override
    public Object findSerializer(Annotated am) {
        Mask annotation = am.getAnnotation(Mask.class);
        if (annotation != null)
            return MaskStringValueSerializer.class;

        return super.findSerializer(am);
    }
}

模型

package com.mask;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.util.Map;

public class Employee {

    @Mask(value = "*** The value of this attribute is masked for security reason ***")
  //  @JsonSerialize(using = MaskStringValueSerializer.class)
    private String name;

    @Mask
   // @JsonSerialize(using = MaskStringValueSerializer.class)
    private String empId;

    private String company;

    /*@JsonSerialize(using = MaskMapStringValueSerializer.class)
    protected Map<Category, String> categoryMap;*/

    public Employee() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmpId() {
        return empId;
    }

    public void setEmpId(String empId) {
        this.empId = empId;
    }

   /* public Map<Category, String> getCategoryMap() {
        return categoryMap;
    }

    public void setCategoryMap(Map<Category, String> categoryMap) {
        this.categoryMap = categoryMap;
    }*/

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }
}

主类

package com.mask;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;


public class MaskValueTest {
private static Logger logger = LoggerFactory.getLogger(MaskValueTest.class);

    public static void main(String args[]) throws Exception{

        Employee employee = new Employee();

        employee.setName("John Doe");
        employee.setEmpId("1234567890");
        employee.setCompany("Wells");

        ObjectMapper mapper = new ObjectMapper();
        mapper.setAnnotationIntrospector(new MaskAnnotationIntrospector());
        logger.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(employee));
    }
}

当前输出

{ "name" : "*** 出于安全原因该属性的值被屏蔽 ***", "empId" : "XXX-默认掩码格式-XXX", “公司”:“abc” }

I have written @Mask annotation to mask sensitive information in logs. It is working fine when I log data using custom JacksonAnnotationIntrospector with ObjectMapper. I want to use this at logback-spring.xml so that any field annotated with @Mask annotation should be masked in logs. any comments how to do it?

Below are the classes.

Mask.java

package com.mask;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Mask {
    String value() default "XXX-DEFAULT MASK FORMAT-XXX";
}

MaskStringValueSerializer.java

package com.mask;

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.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;

public class MaskStringValueSerializer extends StdSerializer<String> implements ContextualSerializer {
    private Mask annot;

    public MaskStringValueSerializer() {
        super(String.class);
    }

    public MaskStringValueSerializer(Mask logMaskAnnotation) {
        super(String.class);
        this.annot = logMaskAnnotation;
    }

    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (annot != null && s != null && !s.isEmpty()) {
            jsonGenerator.writeString(annot.value());
        } else {
            jsonGenerator.writeString(s);
        }
    }

    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        Mask annot = null;
        if (beanProperty != null) {
            annot = beanProperty.getAnnotation(Mask.class);
        }
        return new MaskStringValueSerializer(annot);

    }
}

MaskAnnotationIntrospector.java

package com.mask;

import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;

public class MaskAnnotationIntrospector extends JacksonAnnotationIntrospector {

    @Override
    public Object findSerializer(Annotated am) {
        Mask annotation = am.getAnnotation(Mask.class);
        if (annotation != null)
            return MaskStringValueSerializer.class;

        return super.findSerializer(am);
    }
}

Model

package com.mask;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.util.Map;

public class Employee {

    @Mask(value = "*** The value of this attribute is masked for security reason ***")
  //  @JsonSerialize(using = MaskStringValueSerializer.class)
    private String name;

    @Mask
   // @JsonSerialize(using = MaskStringValueSerializer.class)
    private String empId;

    private String company;

    /*@JsonSerialize(using = MaskMapStringValueSerializer.class)
    protected Map<Category, String> categoryMap;*/

    public Employee() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmpId() {
        return empId;
    }

    public void setEmpId(String empId) {
        this.empId = empId;
    }

   /* public Map<Category, String> getCategoryMap() {
        return categoryMap;
    }

    public void setCategoryMap(Map<Category, String> categoryMap) {
        this.categoryMap = categoryMap;
    }*/

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }
}

main class

package com.mask;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;


public class MaskValueTest {
private static Logger logger = LoggerFactory.getLogger(MaskValueTest.class);

    public static void main(String args[]) throws Exception{

        Employee employee = new Employee();

        employee.setName("John Doe");
        employee.setEmpId("1234567890");
        employee.setCompany("Wells");

        ObjectMapper mapper = new ObjectMapper();
        mapper.setAnnotationIntrospector(new MaskAnnotationIntrospector());
        logger.info(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(employee));
    }
}

current output

{
"name" : "*** The value of this attribute is masked for security reason ***",
"empId" : "XXX-DEFAULT MASK FORMAT-XXX",
"company" : "abc"
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文