首页 > Java > java教程 > 正文

如何在Java关联关系中隐藏敏感数据(使用@JsonProperty)

聖光之護
发布: 2025-10-27 11:36:35
原创
906人浏览过

如何在Java关联关系中隐藏敏感数据(使用@JsonProperty)

本文旨在探讨在java restful api开发中,如何有效隐藏嵌套对象中的敏感数据,特别是在使用jackson库进行json序列化时。我们将重点介绍利用`@jsonproperty(access = jsonproperty.access.write_only)`注解在数据传输对象(dto)层级控制字段可见性的方法,并强调其作为最佳实践的优势,以确保数据安全性和api响应的简洁性。

在构建RESTful API时,返回给客户端的数据通常需要经过精心筛选,以避免泄露敏感信息。当一个数据传输对象(DTO)中包含另一个DTO作为其属性时,例如BillsDto中包含UserDto,隐藏嵌套对象中的特定敏感字段就成为一个常见的需求。例如,在BillsDto的API响应中,我们可能不希望暴露关联UserDto中的username、password和age等字段。

理解Jackson的序列化控制

Java生态中,Jackson是处理JSON序列化和反序列化的主流库。它提供了丰富的注解来控制对象到JSON的转换过程。其中,@JsonProperty注解是一个强大的工具,它不仅可以用于字段的重命名,还可以通过其access属性来精细控制字段的读写权限。

使用 @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 隐藏敏感字段

要隐藏嵌套对象中的敏感数据,最推荐且最直接的方法是在定义敏感字段的原始DTO类中应用@JsonProperty注解,并将其access属性设置为JsonProperty.Access.WRITE_ONLY。

JsonProperty.Access.WRITE_ONLY的含义是:

立即学习Java免费学习笔记(深入)”;

  • 序列化时(写入JSON): 该字段将被忽略,不会出现在生成的JSON字符串中。
  • 反序列化时(从JSON读取): 该字段可以被正常地从传入的JSON数据中读取并设置到对象中。

这种方法将数据隐藏的策略直接嵌入到数据源(即UserDto)本身,无论UserDto在何处被引用,其敏感字段都将遵循这一序列化策略。

以下是修改后的UserDto示例:

灵感PPT
灵感PPT

AI灵感PPT - 免费一键PPT生成工具

灵感PPT 32
查看详情 灵感PPT
import com.fasterxml.jackson.annotation.JsonProperty;

public class UserDto {

    private String number_id;

    // 序列化时隐藏username,反序列化时允许写入
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String username;

    // 序列化时隐藏password,反序列化时允许写入
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

    private String firstName;
    private String lastName;

    // 序列化时隐藏age,反序列化时允许写入
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String age;

    // Getters and Setters (省略)
}
登录后复制

而BillsDto则无需进行任何修改:

import java.util.Date;

public class BillsDto {

    private String numberBills;
    private double amount;
    private Date deadlinePayment;
    private UserDto user; // 引用UserDto,其内部敏感字段已通过@JsonProperty控制

    // Getters and Setters (省略)
}
登录后复制

当BillsDto对象被序列化为JSON时,其内部的user对象将自动遵循UserDto中定义的序列化规则,即username、password和age字段将不会出现在最终的JSON输出中。

为什么这是最佳实践?

  1. 集中管理: 序列化策略在UserDto内部定义,实现了策略与数据模型的高度耦合。这意味着无论UserDto在BillsDto、OrdersDto或其他任何DTO中被引用,其敏感字段都会被一致地隐藏。
  2. 减少错误: 避免了在每个引用UserDto的DTO中重复配置序列化逻辑,从而大大降低了因遗漏配置而导致敏感数据泄露的风险。
  3. 清晰性: 代码意图明确,开发人员一眼就能看出哪些字段是敏感的,不应在序列化输出中暴露。
  4. 可维护性: 如果需要更改敏感字段的可见性,只需修改UserDto一处即可。

替代方案(不推荐)

虽然可以通过在BillsDto的user字段上使用@JsonSerialize注解,并提供一个自定义的UserDto序列化器来实现类似的效果,但这种方法通常不被推荐:

// 不推荐的示例:
public class BillsDto {
    // ... 其他字段
    @JsonSerialize(using = CustomUserDtoSerializer.class) // 不推荐,将序列化逻辑分散
    private UserDto user;
    // ...
}
登录后复制

不推荐的原因:

  • 分散管理: 序列化逻辑分散在多个引用UserDto的DTO中,增加了管理复杂性。
  • 易出错: 很容易忘记在某个地方应用自定义序列化器,导致敏感数据意外暴露。
  • 冗余代码: 可能需要在多个地方编写或引用相同的自定义序列化逻辑。

总结

在Java应用中处理嵌套对象敏感数据隐藏时,利用Jackson的@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)注解直接在原始DTO(例如UserDto)中定义序列化策略是最高效、最安全且最易于维护的方法。它确保了数据隐藏的一致性,减少了潜在的错误,并提升了代码的清晰度和可维护性。始终将数据隐藏的策略与其所属的数据模型紧密结合,是构建健壮和安全API的关键。

以上就是如何在Java关联关系中隐藏敏感数据(使用@JsonProperty)的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号