如何设计支持部分模型权限的 REST 应用程序?

How to design a REST application with support for permissions to parts of the model?

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

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

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

我考虑了几个选项:

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

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

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

如果权限模型是一个单独的 BC,或者只是考虑基础设施而不是任何域的一部分,那么您在服务层进行过滤的方法是正确的。

现在进入您问题的技术部分:

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

最好将 admin/no 管理员决定减少到一个地方:您的应用程序仍然可维护,并且不可能引入 "half done" 错误。 你问题中的方法 #3 是唯一满足该要求的方法,所以我会选择那个方法。

对于#1,重复很明显,而对于#2,在将内容从用户可见性移动到管理员可见性时,您仍然必须更改 DTO 映射器.