资讯专栏INFORMATION COLUMN

java 日志脱敏框架 sensitive-新版本0.0.2-深度拷贝,属性为对象和集合的支持

plokmju88 / 3646人阅读

摘要:项目介绍日志脱敏是常见的安全需求。特性基于注解的日志脱敏可以自定义策略实现,策略生效条件常见的脱敏内置方案深拷贝,且原始对象不用实现任何接口。放在集合属性上,且属性为普通对象作为演示,集合中为普通的字符串。

项目介绍

日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。

本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发。

用户也可以基于自己的实际需要,自定义注解。

特性

基于注解的日志脱敏

可以自定义策略实现,策略生效条件

常见的脱敏内置方案

java 深拷贝,且原始对象不用实现任何接口。

快速开始 maven 导入

    com.github.houbb
    sensitive-core
    0.0.2
定义对象

User.java

我们对 password 使用脱敏,指定脱敏策略为 StrategyPassword。(直接返回 null)

public class User {

    @Sensitive(strategy = StrategyChineseName.class)
    private String username;
    
    @Sensitive(strategy = StrategyCardId.class)
    private String idCard;
    
    @Sensitive(strategy = StrategyPassword.class)
    private String password;
    
    @Sensitive(strategy = StrategyEmail.class)
    private String email;
    
    @Sensitive(strategy = StrategyPhone.class)
    private String phone;
    
    //Getter & Setter
    //toString()
}
属性为集合或者对象

如果某个属性是单个集合或者对象,则需要使用注解 @SensitiveEntry

放在集合属性上,且属性为普通对象

会遍历每一个属性,执行上面的脱敏策略。

放在对象属性上

会处理对象中各个字段上的脱敏注解信息。

放在集合属性上,且属性为对象

遍历每一个对象,处理对象中各个字段上的脱敏注解信息。

放在集合属性上,且属性为普通对象

UserEntryBaseType.java

作为演示,集合中为普通的字符串。

public class UserEntryBaseType {

    @SensitiveEntry
    @Sensitive(strategy = StrategyChineseName.class)
    private List chineseNameList;

    @SensitiveEntry
    @Sensitive(strategy = StrategyChineseName.class)
    private String[] chineseNameArray;
    
    //Getter & Setter & toString()
}

构建对象

/**
 * 构建用户-属性为列表,列表中为基础属性
 * @return 构建嵌套信息
 * @since 0.0.2
 */
public static UserEntryBaseType buildUserEntryBaseType() {
    UserEntryBaseType userEntryBaseType = new UserEntryBaseType();
    userEntryBaseType.setChineseNameList(Arrays.asList("盘古", "女娲", "伏羲"));
    userEntryBaseType.setChineseNameArray(new String[]{"盘古", "女娲", "伏羲"});
    return userEntryBaseType;
}

测试演示

/**
 * 用户属性中有集合或者map,集合中属性是基础类型-脱敏测试
 * @since 0.0.2
 */
@Test
public void sensitiveEntryBaseTypeTest() {
    UserEntryBaseType userEntryBaseType = DataPrepareTest.buildUserEntryBaseType();
    System.out.println("脱敏前原始: " + userEntryBaseType);
    UserEntryBaseType sensitive = SensitiveUtil.desCopy(userEntryBaseType);
    System.out.println("脱敏对象: " + sensitive);
    System.out.println("脱敏后原始: " + userEntryBaseType);
}

日志信息

脱敏前原始: UserEntryBaseType{chineseNameList=[盘古, 女娲, 伏羲], chineseNameArray=[盘古, 女娲, 伏羲]}
脱敏对象: UserEntryBaseType{chineseNameList=[*古, *娲, *羲], chineseNameArray=[*古, *娲, *羲]}
脱敏后原始: UserEntryBaseType{chineseNameList=[盘古, 女娲, 伏羲], chineseNameArray=[盘古, 女娲, 伏羲]}
放在对象属性上

演示对象

这里的 User 和上面的 User 对象一致。

public class UserEntryObject {

    @SensitiveEntry
    private User user;

    @SensitiveEntry
    private List userList;

    @SensitiveEntry
    private User[] userArray;
    
    //...
}

对象构建

/**
 * 构建用户-属性为列表,数组。列表中为对象。
 * @return 构建嵌套信息
 * @since 0.0.2
 */
public static UserEntryObject buildUserEntryObject() {
    UserEntryObject userEntryObject = new UserEntryObject();
    User user = buildUser();
    User user2 = buildUser();
    User user3 = buildUser();
    userEntryObject.setUser(user);
    userEntryObject.setUserList(Arrays.asList(user2));
    userEntryObject.setUserArray(new User[]{user3});
    return userEntryObject;
}

测试演示

/**
 * 用户属性中有集合或者对象,集合中属性是对象-脱敏测试
 * @since 0.0.2
 */
@Test
public void sensitiveEntryObjectTest() {
    UserEntryObject userEntryObject = DataPrepareTest.buildUserEntryObject();
    System.out.println("脱敏前原始: " + userEntryObject);
    UserEntryObject sensitiveUserEntryObject = SensitiveUtil.desCopy(userEntryObject);
    System.out.println("脱敏对象: " + sensitiveUserEntryObject);
    System.out.println("脱敏后原始: " + userEntryObject);
}

测试结果

脱敏前原始: UserEntryObject{user=User{username="脱敏君", idCard="123456190001011234", password="1234567", email="12345@qq.com", phone="18888888888"}, userList=[User{username="脱敏君", idCard="123456190001011234", password="1234567", email="12345@qq.com", phone="18888888888"}], userArray=[User{username="脱敏君", idCard="123456190001011234", password="1234567", email="12345@qq.com", phone="18888888888"}]}
脱敏对象: UserEntryObject{user=User{username="脱*君", idCard="123456**********34", password="null", email="123**@qq.com", phone="188****8888"}, userList=[User{username="脱*君", idCard="123456**********34", password="null", email="123**@qq.com", phone="188****8888"}], userArray=[User{username="脱*君", idCard="123456**********34", password="null", email="123**@qq.com", phone="188****8888"}]}
脱敏后原始: UserEntryObject{user=User{username="脱敏君", idCard="123456190001011234", password="1234567", email="12345@qq.com", phone="18888888888"}, userList=[User{username="脱敏君", idCard="123456190001011234", password="1234567", email="12345@qq.com", phone="18888888888"}], userArray=[User{username="脱敏君", idCard="123456190001011234", password="1234567", email="12345@qq.com", phone="18888888888"}]}
需求 & BUGS
issues
欢迎加入开发

如果你对本项目有兴趣,并且对代码有一定追求,可以申请加入本项目开发。

如果你善于写文档,或者愿意补全测试案例,也非常欢迎加入。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72939.html

相关文章

  • java 日志脱敏框架 sensitive-v0.0.4 系统内置常见注解,支持自定义注解

    摘要:项目介绍日志脱敏是常见的安全需求。常见的脱敏内置方案。支持用户自定义注解。自定义注解导入自定义注解新增功能。策略优先级优先生效,然后是系统内置注解,最后是用户自定义注解。让这些的密码不进行脱敏定义测试对象定义一个使用自定义注解的对象。 项目介绍 日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。 本项目提供基于注解的方式,并且内置了常见的脱敏...

    cheng10 评论0 收藏0
  • 阿里巴巴Java代码规约插件p3c-pmd使用指南与实现解析

    摘要:年月底,阿里巴巴集团发布了阿里巴巴开发手册终极版,年月日,在杭州云栖大会上,代码规约插件全球首发,插件支持以上版本和以上版本。阿里巴巴代码规约插件安装阿里代码规约插件有插件和插件。 2017年9月底,阿里巴巴集团发布了《阿里巴巴Java开发手册》PDF终极版,2017年10月14日,在2017杭州云栖大会上,Java代码规约插件全球首发,p3c-pmd插件支持Eclipse4.2以上版...

    worldligang 评论0 收藏0
  • 余额宝11.11:基于日志数据分析高效运维

    摘要:接下来我们以余额宝为例,重点剖析天弘基金在日志数据分析领域是如何突破的此前,天弘基金一直使用开源的日志方案,研发和运维人员通过对日志数据进行处理,使用日志文件进行查询检索。 双十一刚刚结束,其实最紧张的不是商铺理货,也不是网友紧盯大促商品准备秒杀,而是网购幕后的运维人员,他们最担心:什么网络中断、应用卡顿、响应速度慢,服务器宕机……双十一作为电商 IT 部门的头等大事,大促前,运维人员就需要...

    wenshi11019 评论0 收藏0

发表评论

0条评论

plokmju88

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<