SpringBoot进阶-SpringBoot如何对接口返回数据进行脱敏操作?

通常情况下,在我们开发一些数据敏感的项目的时候,需要对接口中的返回数据进行一个脱敏处理,例如在有些接口上会返回身份证号、手机号、家庭住址等信息,而对于这些数据的处理一般情况下我们会通过 * 号来隐藏掉部分的关键数据。那么如何优雅的实现敏感数据的脱敏处理呢?

如何优雅的实现接口数据脱敏操作?

第一步、需要定义一个用来进行数据脱敏的注解

我们通过注解的方式来定义哪些字段需要进行脱敏处理,被注解标注的字段就进行脱敏处理未被标记的字段就不需要进行脱敏处理。

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

第二步、需要根据不同的字段,制定不同的脱敏策略

public enum  SensitiveStrategy {
    // 对于用户名脱敏操作
    USERNAME(s->s.replaceAll("(S)S(S*)","$1*$2")),
    // 对用户身份证号进行脱敏
    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 desensitizer;

    SensitiveStrategy(Function desensitizer){
        this.desensitizer = desensitizer;
    }

    public Function desensitizer(){
        return desensitizer;
    }
}

第三步、制定序列化实现方案

只要是添加UnSensitive注解的字段都进行脱敏处理

public class SensitiveJsonSerializer extends JsonSerializer implements ContextualSerializer {

    private SensitiveStrategy sensitiveStrategy;

    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(sensitiveStrategy.desensitizer().apply(s));
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        UnSensitive annotation = beanProperty.getAnnotation(UnSensitive.class);

        if (Objects.nonNull(annotation)&&Objects.equals(String.class,beanProperty.getType().getRawClass())){
            this.sensitiveStrategy = annotation.strategy();
            return this;
        }
        return serializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);
    }
}

测试脱敏效果

第一步、定义一个User的测试类并且加上对应的脱敏注解

public class User {
    @UnSensitive(strategy = SensitiveStrategy.USERNAME)
    private String username;
    @UnSensitive(strategy = SensitiveStrategy.ID_CARD)
    private String idcard;
    @UnSensitive(strategy = SensitiveStrategy.PHONE)
    private String phone;
    @UnSensitive(strategy = SensitiveStrategy.ADDRESS)
    private String address;
  
  	// setter getter代码被删除
}

第二步、定义测试类调用

@RestController
public class TestController {

    @GetMapping("/test")
    public User getUser(){
        User user = new User();
        user.setUsername("张无忌");
        user.setIdcard("214578859632145123");
        user.setPhone("18545678956");
        user.setAddress("武当山");
        return user;
    }
}

测试结果如图所示。

总结

在实际开发过程中,数据脱敏的方式有很多种,在开发过程中,可以根据自己的需求来选择合适的数据脱敏操作来完成对于关键信息的保护。

展开阅读全文

页面更新:2024-04-20

标签:武当山   进阶   操作   数据   注解   字段   手机号   身份证号   优雅   接口   定义   测试

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top