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

    项目介绍

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

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

    特性

    1. 基于注解的日志脱敏。

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

    3. 常见的脱敏内置方案。

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

    5. 支持用户自定义注解。

    自定义注解

    maven 导入

    <dependency>
        <groupId>com.github.houbb</groupId>
        <artifactId>sensitive-core</artifactId>
        <version>0.0.4</version>
    </dependency>
    

    自定义注解

    v0.0.4 新增功能。允许功能自定义条件注解和策略注解。

    案例

    自定义注解

    • 策略脱敏
    /**
     * 自定义密码脱敏策略
     * @author binbin.hou
     * date 2019/1/17
     * @since 0.0.4
     */
    @Inherited
    @Documented
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @SensitiveStrategy(CustomPasswordStrategy.class)
    public @interface SensitiveCustomPasswordStrategy {
    }
    
    • 脱敏生效条件
    /**
     * 自定义密码脱敏策略生效条件
     * @author binbin.hou
     * date 2019/1/17
     * @since 0.0.4
     */
    @Inherited
    @Documented
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @SensitiveCondition(ConditionFooPassword.class)
    public @interface SensitiveCustomPasswordCondition{
    }
    
    • TIPS

    @SensitiveStrategy 策略单独使用的时候,默认是生效的。

    如果有 @SensitiveCondition 注解,则只有当条件满足时,才会执行脱敏策略。

    @SensitiveCondition 只会对系统内置注解和自定义注解生效,因为 @Sensitive 有属于自己的策略生效条件。

    • 策略优先级

    @Sensitive 优先生效,然后是系统内置注解,最后是用户自定义注解。

    对应的实现

    两个元注解 @SensitiveStrategy@SensitiveCondition 分别指定了对应的实现。

    • CustomPasswordStrategy.java
    public class CustomPasswordStrategy implements IStrategy {
    
        @Override
        public Object des(Object original, IContext context) {
            return "**********************";
        }
    
    }
    
    • ConditionFooPassword.java
    /**
     * 让这些 123456 的密码不进行脱敏
     * @author binbin.hou
     * date 2019/1/2
     * @since 0.0.1
     */
    public class ConditionFooPassword implements ICondition {
        @Override
        public boolean valid(IContext context) {
            try {
                Field field = context.getCurrentField();
                final Object currentObj = context.getCurrentObject();
                final String name = (String) field.get(currentObj);
                return !name.equals("123456");
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
    
    }
    

    定义测试对象

    定义一个使用自定义注解的对象。

    public class CustomPasswordModel {
    
        @SensitiveCustomPasswordCondition
        @SensitiveCustomPasswordStrategy
        private String password;
    
        @SensitiveCustomPasswordCondition
        @SensitiveStrategyPassword
        private String fooPassword;
        
        //其他方法
    }
    

    测试

    /**
     * 自定义注解测试
     */
    @Test
    public void customAnnotationTest() {
        final String originalStr = "CustomPasswordModel{password='hello', fooPassword='123456'}";
        final String sensitiveStr = "CustomPasswordModel{password='**********************', fooPassword='123456'}";
        CustomPasswordModel model = buildCustomPasswordModel();
        Assert.assertEquals(originalStr, model.toString());
    
        CustomPasswordModel sensitive = SensitiveUtil.desCopy(model);
        Assert.assertEquals(sensitiveStr, sensitive.toString());
        Assert.assertEquals(originalStr, model.toString());
    }
    

    构建对象的方法如下:

    /**
     * 构建自定义密码对象
     * @return 对象
     */
    private CustomPasswordModel buildCustomPasswordModel(){
        CustomPasswordModel model = new CustomPasswordModel();
        model.setPassword("hello");
        model.setFooPassword("123456");
        return model;
    }
    
  • 相关阅读:
    2015 10月21日 工作计划与执行
    2015 10月20日 工作计划与执行
    2015 10月19日 工作计划与执行
    排序算法之归并排序 分类: C/C++ 数据结构与算法 2015-06-29 16:46 190人阅读 评论(0) 收藏
    sublime个人配置(C++程序员) 分类: C/C++ 2015-06-29 09:29 95人阅读 评论(0) 收藏
    排序算法之简单排序 分类: C/C++ 2015-06-29 08:14 252人阅读 评论(0) 收藏
    profile与bashrc 分类: Ubuntu学习笔记 2015-06-26 14:42 146人阅读 评论(0) 收藏
    leetCode(26):Unique Binary Search Trees 分类: leetCode 2015-06-23 14:09 155人阅读 评论(0) 收藏
    leetCode(25):Validate Binary Search Tree 分类: leetCode 2015-06-23 13:00 154人阅读 评论(0) 收藏
    leetCode(24):Binary Search Tree Iterator 分类: leetCode 2015-06-23 11:50 192人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/houbbBlogs/p/10286177.html
Copyright © 2011-2022 走看看