在现代应用程序中,数据安全性至关重要,尤其是在处理敏感信息时。本文将详细介绍如何在 Spring Boot 应用程序中实现数据脱敏,采用 YAML 配置,而不是 AOP(面向切面编程)和注解方式。这种方法简单易懂,并且便于管理和扩展。
1. 项目准备
1.1 创建 Spring Boot 项目
可以使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加以下依赖:
- Spring Web
- Spring Boot DevTools
1.2 项目结构
创建以下目录结构:
src
└── main
├── java
│ └── com
│ └── example
│ └── demo
│ ├── DemoApplication.java
│ ├── config
│ │ └── DataMaskConfig.java
│ └── controller
│ └── UserController.java
└── resources
├── application.yml
└── messages.yml
2. YAML 配置
在 src/main/resources/application.yml
中,定义需要脱敏的字段及其脱敏规则:
data-mask:
user:
name: "MASKED_NAME" # 名字脱敏规则
email: "MASKED_EMAIL" # 邮箱脱敏规则
2.1 定义脱敏规则
在 src/main/resources/messages.yml
中,定义不同的脱敏格式:
MASKED_NAME: "${name:0:1}**" # 保留首字母,后面用星号替代
MASKED_EMAIL: "${email:0:3}****@${email:4:6}" # 保留前三位,后面用星号替代
3. 数据脱敏配置类
在 src/main/java/com/example/demo/config/DataMaskConfig.java
中,创建配置类:
package com.example.demo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DataMaskConfig {
@Value("${data-mask.user.name}")
private String nameMask;
@Value("${data-mask.user.email}")
private String emailMask;
public String getNameMask() {
return nameMask;
}
public String getEmailMask() {
return emailMask;
}
}
4. 创建用户控制器
在 src/main/java/com/example/demo/controller/UserController.java
中,创建用户控制器,处理用户请求并返回脱敏数据:
package com.example.demo.controller;
import com.example.demo.config.DataMaskConfig;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final DataMaskConfig dataMaskConfig;
public UserController(DataMaskConfig dataMaskConfig) {
this.dataMaskConfig = dataMaskConfig;
}
@GetMapping("/user/{id}")
public String getUser(@PathVariable String id) {
// 模拟用户数据
String name = "John Doe";
String email = "john.doe@example.com";
// 数据脱敏
String maskedName = maskData(name, dataMaskConfig.getNameMask());
String maskedEmail = maskData(email, dataMaskConfig.getEmailMask());
return String.format("用户ID: %s, 姓名: %s, 邮箱: %s", id, maskedName, maskedEmail);
}
private String maskData(String data, String mask) {
// 这里可以根据需要实现具体的脱敏逻辑
// 示例:简单替换,实际使用中可以使用正则表达式等复杂逻辑
return data.replaceAll(".", "*"); // 用星号替代
}
}
5. 启动应用
确保项目依赖已正确导入,然后运行 DemoApplication.java
:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
6. 测试数据脱敏
启动应用后,访问 http://localhost:8080/user/1
,将返回脱敏后的用户信息:
用户ID: 1, 姓名: **** ***, 邮箱: ****@example.com
7. 总结
通过本文,我们实现了一种基于 Spring Boot 和 YAML 的数据脱敏方案,避免了使用 AOP 和注解。这种方法易于理解和维护,适合需要处理大量敏感数据的项目。可以根据需要进一步扩展脱敏逻辑,以满足不同业务场景的需求。