# sensitive-spring-boot-starter **Repository Path**: cdw/sensitive-spring-boot-starter ## Basic Information - **Project Name**: sensitive-spring-boot-starter - **Description**: SpringBoot可以配置的数据脱敏组件,非注解版 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 1 - **Created**: 2023-05-09 - **Last Updated**: 2024-12-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: 数据脱敏, Java, SpringBoot ## README # SpringBoot通用数据脱敏组件

maven code style

> 网上有很多的脱敏组件,但普遍都是基于注解通过硬编码的方式来实现脱敏,不够灵活,本项目主要是将脱敏规则与注解剥离,可以通过读取数据库脱敏规则,并且随时可以调整脱敏策略。 > ## 引入依赖 > `sensitive-spring-boot-starter`为自己封装的组件,已发布到`maven central repository`仓库 ```xml io.gitee.cdw sensitive-spring-boot-starter 版本号 ``` ## 加载脱敏策略 > 实现脱敏策略加载接口`ISensitiveStrategyLoader`,并注册成SpringBean(以下模拟从数据库加载脱敏策略) ```java @Component public class SensitiveStrategyLoader implements ISensitiveStrategyLoader { @Override public List load() { // 模拟从数据库加载脱敏规则 List list = new ArrayList<>(); // 脱敏规则 123456 -> ****** FieldStrategyConfig config2 = new FieldStrategyConfig(); config2.setName("/sensitive"); // SpringMvc使用接口Uri作为接口名称 config2.setField("com.example.entity.SensitiveInfo#password"); config2.setType("all"); // 使用内置的脱敏策略 list.add(config2); // 脱敏规则 330327111111111994 -> 330327********1994 FieldStrategyConfig config3 = new FieldStrategyConfig(); config3.setField("com.example.entity.SensitiveInfo#idCard"); config3.setType("idcard"); // 使用内置的脱敏策略 list.add(config3); // 脱敏规则 18011111068 -> *******1068 FieldStrategyConfig config4 = new FieldStrategyConfig(); config4.setField("com.example.entity.SensitiveInfo#workMobile"); // 不指定接口名称则对所有接口生效 config4.setType("custom"); // 使用自定义的脱敏策略 config4.setLeft(0); // 左边显示0位 config4.setRight(4); // 右边显示4位 list.add(config4); // 脱敏规则 123456789 -> 123**6789 FieldStrategyConfig config5 = new FieldStrategyConfig(); config5.setField("com.example.entity.SensitiveInfo#cardNo"); config5.setType("custom"); // 使用自定义的脱敏策略 config5.setPattern("(?<=\\w{3})\\w(?=\\w{4})"); // 正则脱敏 list.add(config5); return list; } } ``` > 编写测试的Controller ```java @RestController public class SensitiveController { @RequestMapping("/sensitive") public SensitiveInfo sensitive() { SensitiveInfo sensitiveInfo = new SensitiveInfo(); sensitiveInfo.setMobile("13611112400"); sensitiveInfo.setName("王老五"); sensitiveInfo.setIdCard("330327111111111994"); return sensitiveInfo; } } ``` > 返回结果 ```json { "name": "王老五", "mobile": "136****2400", "workMobile": "*******2400", "idCard": "330327********1994" } ``` **动态加载策略** > 通过使用`StrategyManager`类的以下方法动态添加脱敏策略 ```java public class StrategyManager{ /** * 全局脱敏策略 * * @param field 需要脱敏的类字段格式:类名#成员属性名(如:com.example.entity.SensitiveInfo#Name) * @param type 脱敏策略 * @param left 左边显示位数 * @param right 右边显示位数 */ void addConfig(String field, String type, int left, int right) /** * 特定接口脱敏策略 * * @param name 接口名称 * @param field 需要脱敏的类字段 * @param type 脱敏策略 * @param left 左边显示位数 * @param right 右边显示位数 */ void addReqConfig(String name, String field, String type, int left, int right) /** * 重新加载脱敏策略 */ public void reload() } ``` > 测试案例 ```java // 通过Spring注入脱敏策略管理器 @Autowired private StrategyManager strategyManager; // 添加策略 针对所有接口生效 strategyManager.addConfig("com.example.entity.SensitiveInfo#Name", "chineseName"); // 添加策略 只对/sensitive这个接口生效 strategyManager.addReqConfig("/sensitive","com.example.entity.SensitiveInfo#Name", "chineseName"); // 重新加载脱敏策略使之生效 strategyManager.reload(); ``` ## 内置脱敏规则 | 策略代码 | 策略名称 | 默认样式 | |-------------|--------|--------------------| | idcard | 证件号码脱敏 | 330327********1994 | | mobile | 手机号码脱敏 | 136****2400 | | chineseName | 中文姓名脱敏 | 王*五 | | email | 邮箱脱敏 | c***@gmail.com | | all | 全文脱敏 | ****** |