Giter VIP home page Giter VIP logo

spring-sensitive's Introduction

spring-sensitive

License

基于springboot的数据脱敏,实现了"模型类"和"AOP注解"两种方法,选择其中一种即可

  • 选择任意一种即可,若同时使用,先执行controller层的脱敏,再执行模型类里面的脱敏(返回视图默认Jackson)
  • 基于AOP实现的方法,也可用于其它spring方法上,如无效,记得引入spring的aop包
  • 脱敏了的数据,前端传回来后,可进行数据回填,参考下面的"数据回写"部分,基于fastJson实现

如何使用

 <dependency>
   <groupId>com.github.doobo</groupId>
   <artifactId>spring-sensitive</artifactId>
   <version>1.3</version>
 </dependency>

使用fastJson脱敏

/**
 * 基于fastJson的数据脱敏
 */
@DesensitizationParams({
        @DesensitizationParam(type = SensitiveType.NULL, fields = {"id","address"}),
        @DesensitizationParam(type = SensitiveType.MOBILE_PHONE, fields = {"phone", "idCard"}),
        @DesensitizationParam(type = SensitiveType.BANK_CARD, fields = "$..bankCard", mode = HandleType.RGE_EXP),
        @DesensitizationParam(regExp = "(?<=\\w{2})\\w(?=\\w{1})", fields = "$[0].idCard2", mode = HandleType.RGE_EXP)
})
@GetMapping("fast")
public List<UserDesensitization> sensitive(){
    return Arrays.asList(new UserDesensitization(), new UserDesensitization());
}

使用jackson脱敏,基于jackson的JsonSerialize实现

@Data
public class UserSensitive {

	@SensitiveInfo(value = SensitiveType.CHINESE_NAME)
	String name = "张三";

	@SensitiveInfo(value = SensitiveType.ID_CARD)
	String idCard = "430524202012120832";

	@SensitiveInfo(regExp = "(?<=\\w{3})\\w(?=\\w{4})")
	String idCard2 = "430524202012120832";

	@SensitiveInfo(value = SensitiveType.MOBILE_PHONE)
	String phone = "1234567890";

	@SensitiveInfo(value = SensitiveType.FIXED_PHONE)
	String ext = "0739-8888888";

	@SensitiveInfo(value = SensitiveType.ADDRESS)
	String address = "湖南省长沙市高新区岳麓大道芯城科技园";

	@SensitiveInfo(value = SensitiveType.NULL)
	String address2 = "湖南省";

	@SensitiveInfo(value = SensitiveType.BANK_CARD)
	String bankCard = "622260000027736298837";
	
	@SensitiveInfo(value = SensitiveType.NULL)
	Integer id = 654321;
}

方法调用输出

@SpringBootTest
public class ApplicationTests {

    /**
     * jackson脱敏测试
     * @throws JsonProcessingException
     */
    @Test
    void testSensitive() throws JsonProcessingException {
        UserSensitive user = new UserSensitive();
        ObjectMapper objectMapper = new ObjectMapper();
        String str = objectMapper.writeValueAsString(user);
        System.out.println(str);
    }
    
}

数据回写

有些数据脱敏给前端后,传回给后台时,需要回填到入参里面去,如一些用户ID,手机号等信息

/**
 * IndexController.java
 * 数据回填,不给argName默认取第一个参数
 * @param pt1
 * @param pt2
 */
@HyposensitizationParams({
        @HyposensitizationParam(type = "card", fields = "bankCard"),
        @HyposensitizationParam(argName = "a", type = "string"),
        @HyposensitizationParam(argName = "pt1", type = "phone", fields = {"idCard","phone"}),
        @HyposensitizationParam(argName = "pt2", type = "reg", fields = {"$..address", "$.bankCard"}, mode = HandleType.RGE_EXP)
})
@GetMapping("undo")
public String Hyposensitization(UserDesensitization pt1, UserSensitive pt2, String a){
    return JSON.toJSONString(Arrays.asList(pt1, pt2, a));
}

//PtoUndoObserver.java
@Component
public class PtoUndoObserver extends UndoObserver {

    /**
     * 返回True才执行undoValue
     */
    @Override
    public boolean matching(UndoVO vo) {
        return "card".equals(vo.getType()) || "reg".equals(vo.getType());
    }

    /**
     * 如果是基本类型的入参,并且参数为空,无内存地址,不替换内容
     * 继承观察者,可填充到方法的入参里面
     */
    @Override
    public void undoValue(UndoVO vo) {
        if (vo.getType().equals("card")) {
            vo.undo("...1");
        }
        if (vo.getType().equals("phone")) {
            vo.undo("......2");
        }
        if (vo.getType().equals("reg")) {
            vo.undo('.');
        }
        if(vo.getType().equals("string")){
            vo.undo("............4");
        }
        if(vo.getType().equals("obj")){
            vo.undo(new SingleObj().setAuthor("............5"));
        }
    }
}

自定义脱敏函数

@Service
public class SensitiveServiceImpl extends AbstractSensitiveService {

   @Override
   public String idCardNum(String idCardNum, int front, int end) {
       return super.idCardNum(idCardNum, front, end);
   }
   
   @Override
   public String selfFastJsonHandler(String input, DesensitizationParam param) {
       if("self".equals(param.tag())){
           return "fastJsonSelfHandler:" + input;
       }
       return input;
   }

   @Override
   public String selfJacksonHandler(String input, SensitiveInfo param) {
       return "JacksonHandler:" + input;
   }
}

全局配置是否启动相关功能

sensitive:
  enableFastFilter: true
  enableJackFilter: true
  enableUndoFilter: true

脱敏结果

脱敏结果

数据回写结果

数据回写

spring-sensitive's People

Contributors

doobo avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.