Java代码AOP数据脱敏

时间:2025-03-16 19:28:31

如何使用Spring AOP对数据进行脱敏处理。这个例子假设我们有一个CustomerService类,其中包含一个返回客户信息的方法getCustomerInfo()。我们将使用AOP对该方法的结果进行脱敏处理。

1. 添加依赖

首先,确保pom.xml文件中包含必要的Spring AOP依赖:

<dependencies>
    <!-- 其他依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

2. 创建实体类

创建一个简单的CustomerInfo实体类来存储客户信息:

public class CustomerInfo {
    private String name;
    private String ssn; // Social Security Number
    private String creditCardNumber;

    // Getters and Setters
}

3. 创建服务类

接下来,创建一个服务类CustomerService,该类提供了一个方法来获取客户信息:

import org.springframework.stereotype.Service;

@Service
public class CustomerService {

    public CustomerInfo getCustomerInfo() {
        CustomerInfo customerInfo = new CustomerInfo();
        customerInfo.setName("John Doe");
        customerInfo.setSsn("123-45-6789");
        customerInfo.setCreditCardNumber("1234567890123456");

        return customerInfo;
    }
}

4. 实现AOP切面

现在,实现一个AOP切面来进行数据脱敏:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class DataMaskingAspect {

    @Around("execution(* com.example.service.CustomerService.getCustomerInfo(..))")
    public Object maskCustomerData(ProceedingJoinPoint joinPoint) throws Throwable {
        // 执行目标方法
        Object result = joinPoint.proceed();

        if (result instanceof CustomerInfo) {
            CustomerInfo customerInfo = (CustomerInfo) result;
            // 对敏感数据进行脱敏处理
            customerInfo.setSsn(maskSsn(customerInfo.getSsn()));
            customerInfo.setCreditCardNumber(maskCreditCardNumber(customerInfo.getCreditCardNumber()));
        }

        return result;
    }

    private String maskSsn(String ssn) {
        // 简单地用*号代替部分数字
        return "XXX-XX-" + ssn.substring(7);
    }

    private String maskCreditCardNumber(String creditCardNumber) {
        // 保留前4位和后4位,中间用*代替
        return creditCardNumber.substring(0, 4) + "********" + creditCardNumber.substring(creditCardNumber.length() - 4);
    }
}

5. 测试

最后,可以编写一个简单的测试类或使用Spring Boot的自动配置功能来验证数据是否已正确脱敏:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Autowired
    private CustomerService customerService;

    @GetMapping("/customer-info")
    public CustomerInfo getCustomerInfo() {
        return customerService.getCustomerInfo();
    }
}

当访问/customer-info端点时,应该能看到经过脱敏处理后的客户信息。这种方法使得数据脱敏逻辑与业务逻辑分离,有助于提高代码的清晰度和可维护性。同时,由于AOP的非侵入特性,可以在不对现有业务逻辑做任何改动的情况下添加数据脱敏功能。