数据脱敏方案:不使用 AOP + 注解,使用 SpringBoot + YAML 实现
引言
在现代应用中,数据安全性是一个不可忽视的话题。特别是在处理用户敏感信息(如身份证号码、手机号码等)时,如何实现数据脱敏是一个重要的需求。传统方法多依赖于面向切面编程(AOP)和注解,但在某些情况下,我们可能会选择使用更简单的方式来实现这样的功能。本文将介绍如何在 Spring Boot 应用中,利用 YAML 配置来实现数据脱敏。
方案设计
我们将创建一个简单的 Spring Boot 应用,来演示如何根据 YAML 配置对敏感数据进行脱敏。我们假设有一个用户对象,其中包含一些敏感信息,如姓名、手机号和身份证号等。
1. 创建数据模型
首先,我们定义一个用户类,包含需要脱敏的字段。
public class User {
private String name;
private String phoneNumber;
private String idCard;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
}
2. YAML 配置文件
接下来,我们定义一个 YAML 配置文件,指定需要脱敏的字段和脱敏规则。
# application.yaml
data:
mask:
name: true
phoneNumber: true
idCard: true
在这个配置中,我们简单地用布尔值来表示各个字段是否需要脱敏。
3. 创建数据脱敏服务
我们可以创建一个服务类来处理数据脱敏的逻辑。通过读取 YAML 配置文件,决定如何脱敏每个字段。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class DataMaskingService {
@Value("${data.mask.name}")
private boolean maskName;
@Value("${data.mask.phoneNumber}")
private boolean maskPhoneNumber;
@Value("${data.mask.idCard}")
private boolean maskIdCard;
public User maskUser(User user) {
if (maskName) {
user.setName(maskName(user.getName()));
}
if (maskPhoneNumber) {
user.setPhoneNumber(maskPhoneNumber(user.getPhoneNumber()));
}
if (maskIdCard) {
user.setIdCard(maskIdCard(user.getIdCard()));
}
return user;
}
private String maskName(String name) {
return name.charAt(0) + "**";
}
private String maskPhoneNumber(String phoneNumber) {
return phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);
}
private String maskIdCard(String idCard) {
return idCard.substring(0, 6) + "********";
}
}
4. 使用数据脱敏服务
最后,我们可以在 Controller 中使用这个脱敏服务,将敏感数据返回给客户端之前执行脱敏处理。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private DataMaskingService dataMaskingService;
@GetMapping("/info")
public User getUserInfo() {
User user = new User();
user.setName("张三");
user.setPhoneNumber("13812345678");
user.setIdCard("420XXXXXXXXXXXX");
return dataMaskingService.maskUser(user);
}
}
总结
通过以上示例,我们展示了一种简单便捷的方式,不依赖 AOP 和注解,通过 Spring Boot 和 YAML 配置实现数据脱敏。此方案的优点是实现简单,易于理解,适用于较为简单的数据脱敏需求。在实际应用中,脱敏逻辑可以根据具体情况进行扩展。同时,这种方式也使得脱敏策略的修改变得更加灵活,只需调整 YAML 配置即可,无需改动代码。