Java 通过注解实现接口输出时数据脱敏

在后台管理中,对于手机号,身份证,姓名这些数据不允许所有人都能看,这时候我们要对相对数据进行脱敏.

先声明了一个注解, 通过对相关接口函数进行声明,以及配置需要脱敏的参数类型SecretTypeEnum,默认脱敏手机号

/**
 * 脱敏声明
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SecretManage {
   
   

    SecretTypeEnum[] value() default {
   
   SecretTypeEnum.MOBILE};

}

我们目前只支持对手机号,身份证,用户姓名三个字段进行脱敏, 字段名称必须符合枚举的desc值

package com.test.base.enums;


import com.fasterxml.jackson.annotation.JsonValue;

/**
 * @author fyf
 * @date 2021/2/26
 */
public enum SecretTypeEnum implements BaseEnum {
   
   
    MOBILE(0, "mobile"),
    NAME(1, "name"),
    ID(2, "identity")
    ;

    @JsonValue
    private int code;
    private String desc;

    public String getDesc() {
   
   
        return desc;
    }

    SecretTypeEnum(int code, String desc) {
   
   
        this.code = code;
        this.desc = desc;
    }

    @Override
    public 
### Java实现数据脱敏的最佳实践和常用方法 #### 1. 使用自定义类型处理器 (MyBatis 类型处理器) 通过 MyBatis 的 `typeHandler` 功能,可以在数据库查询结果映射阶段对敏感字段进行脱敏处理。具体做法是在 Mapper 文件中配置 `<result>` 标签,并指定对应的 `typeHandler` 实现类。 以下是示例代码: ```xml <resultMap id="resultMap" type="com.example.Entity"> <result column="sensitive_column" property="sensitiveColumn" javaType="java.lang.String" typeHandler="com.example.SensitiveDataHandler"/> </resultMap> ``` 在此过程中,`SensitiveDataHandler` 是一个实现了 `org.apache.ibatis.type.TypeHandler` 接口的类[^1]。该类负责定义具体的脱敏逻辑。 --- #### 2. 利用 Jackson 注解实现 JSON 数据脱敏 对于基于 RESTful API 返回的数据,可以通过 Jackson 提供的功能来实现自动化的数据脱敏。主要方式是创建自定义注解并配合序列化器完成操作。 以下是一个典型的例子: - **自定义注解** ```java @Target(ElementType.FIELD) @JacksonAnnotationsInside @Retention(RetentionPolicy.RUNTIME) @JsonSerialize(using = SensitiveJsonSerializer.class) public @interface Sensitive { SensitiveTypeEnum strategy(); } ``` - **自定义序列化器** ```java public class SensitiveJsonSerializer extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value != null && !value.isEmpty()) { switch (strategy) { case MASK_EMAIL: gen.writeString(maskEmail(value)); break; case MASK_PHONE: gen.writeString(maskPhone(value)); break; default: gen.writeString(value); } } else { gen.writeString(""); } } private String maskEmail(String email) { int atIndex = email.indexOf('@'); return atIndex > 0 ? "***" + email.substring(atIndex - 1) : email; } private String maskPhone(String phone) { return phone.replaceAll("(\\d{3})\\d{4}(\\d+)", "$1****$2"); } } ``` 上述代码展示了如何针对不同的策略(如邮箱地址或手机号)应用特定的掩码规则[^3]。 --- #### 3. Spring Boot 中集成全局脱敏功能 在实际项目开发中,通常会结合 AOP 或拦截器技术,在业务层面上统一管理数据脱敏行为。例如,可以编写一个通用工具类用于执行脱敏逻辑,再将其嵌入到 DTO 对象转换流程中。 下面是一段简单的伪代码演示: ```java @Component public class DataMaskingInterceptor implements HandlerInterceptor { @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { if (modelAndView != null && modelAndView.getModel() instanceof Map<?, ?>) { ((Map<?, ?>) modelAndView.getModel()).forEach((key, value) -> applyMask(key.toString(), value)); } } private void applyMask(String key, Object value) { if ("email".equalsIgnoreCase(key)) { System.out.println("原始值:" + value); // 替代为日志记录或其他调试手段 // 执行邮件脱敏逻辑... } else if ("phone".equalsIgnoreCase(key)) { // 执行电话号码脱敏逻辑... } } } ``` 此片段说明了如何利用 Spring MVC 拦截器机制动态调整响应内容中的敏感信息[^2]。 --- #### 4. 请求参数加密与返回值保持一致性 某些情况下,可能还需要考虑客户端传递过来的请求参数也需要经过某种形式的安全加固措施后再提交至服务端解析;与此同又要保证最终反馈给前端用户的仍是未加工过的明文版本。这种需求可通过双重编码或者哈希算法达成目标——即先对外部输入做一次不可逆变换存储于内存变量之中参与后续计算过程,待整个事务结束之后重新还原成初始形态输出即可满足条件[^4]。 --- ### 总结 综上所述,Java 生态圈提供了多种途径帮助开发者高效实施数据隐私保护工作。无论是借助框架内置特性还是自行扩展组件库都能达到理想效果。然而值得注意的是每种解决方案都有其适用范围以及局限之处因此建议根据实际情况灵活选用最为合适的那一款!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值