【问题标题】:How to design a REST application with support for permissions to parts of the model?如何设计一个支持模型部分权限的 REST 应用程序?
【发布时间】:2015-10-11 17:56:33
【问题描述】:

我在开发一个公开 REST API 的 Java 应用程序。我遵循领域驱动设计。 REST API 返回聚合根以及聚合内的所有实体。

该模型是一组 Java POJO 类,不包含对基础架构代码的任何引用,并且由 Jersey 提供 REST 支持并带有 Jackson 序列化。

新要求是根据用户权限添加对返回/不返回模型部分的支持,例如对于GET /user/{user_id}

  • 普通用户应该得到{login: "john", name: "John Smith"}
  • 而管理员用户应该得到{id: 1, login: "john", name: "John Smith", active: "true"}

我考虑了几个选项:

  1. 创建 DTO 类,如 UserForAdminsDTOUserForRegularUserDTO
  2. 扩展模型类(通过继承或组合)并提供一个实现,该实现将覆盖(在继承的情况下)不应为普通用户返回数据的方法,例如Long getId() { return null; }
  3. 创建自定义序列化器/反序列化器,它将在模型上使用自定义注释,例如@OnlyAvailableFor(ADMIN)

您知道其他方法吗?你觉得我提供的三个怎么样?

【问题讨论】:

    标签: java rest domain-driven-design


    【解决方案1】:

    您使用 DDD 标记了问题,因此您应该考虑您的方法是否将域逻辑泄漏到服务层中。如果数据(您的示例中的用户信息)和权限模型都是同一个 BC 的一部分,就会出现这种情况。

    如果权限模型是单独的 BC,或者只是被视为基础架构而不是任何域的一部分,那么您在服务层中进行过滤的方法是正确的。

    现在是您问题的技术部分:

    我建议不要创建不同的 DTO,因为这意味着在 DTO 中复制代码,而这反过来又是对接口规范的复制。

    最好将 admin/no admin 的决定减少到一个地方:您的应用程序保持可维护性,并且不可能引入“半途而废”的错误。 您问题中的方法 #3 是唯一满足该要求的方法,因此我会采用该方法。

    使用 #1,重复很明显,而使用 #2 在将内容从用户可见性转移到管理员可见性时,您仍然需要更改 DTO 映射器。

    【讨论】:

    • 感谢@theDmi,我也发现#3 是最好的方法。顺便说一句,我已经开始关注 domain-driven-design 标签,看来你用这个标签回答了 100% 的问题,令人印象深刻!继续努力!谢谢
    • @AdamSiemion 谢谢!是的,我觉得这个话题非常有趣,并且认为整个软件行业都可以从更多地了解 DDD 中受益。这并不意味着 DDD 应该无处不在,但知道它的概念肯定是一件好事。
    猜你喜欢
    • 2014-03-23
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多