【问题标题】:Domain-Driven Design with different roles具有不同角色的领域驱动设计
【发布时间】:2021-09-01 13:32:59
【问题描述】:

我是 DDD 的新手。我想构建一个实现 DDD 的应用程序,但我的角色有问题。

应用程序有许多角色,如customeradmin 等。admin 可以创建、编辑和删除postcustomer只能评论post

基于该描述,我认为post 在这两种不同的上下文中应该有不同的方法。我应该为这 2 个角色创建 2 个目录并在每个目录中复制 post 吗?

非常感谢!

【问题讨论】:

  • 请注意不要将代码的物理结构方式与逻辑构思的方式 (DDD) 混淆。

标签: typescript architecture domain-driven-design


【解决方案1】:

有不同的域,有不同的限界上下文。

影响业务状态变化的核心领域只关心如何实现这些变化。它不太关心安全或访问控制。

您的应用程序/集成层是看门人,并决定谁可以调用域上的什么。为此,您甚至可以使用另一个 身份和访问管理 (IAM) 有界上下文来管理授权。

例如,我喜欢使用物理计算器来表示我的域。我可以访问计算器上的任何和所有功能。计算器之外的东西需要确定我可以按下哪些按钮。我希望这是有道理的。

【讨论】:

  • 我认为你有一个好的答案的基础,但你可能需要详细说明,以便 OP 知道如何在他的情况下应用它。例如。限界上下文如何帮助他。
  • 你的意思是域不需要知道任何关于数据访问控制或基于角色的系统的知识,应用层会处理吗?所以我不应该将有界上下文划分为manage postexplore post 而只是post?如果我弄错了,请告诉我。
  • @Ngọc Nguyễn,由于域将专注于状态突变,您通常不应该使用域来查询数据。请求进出带来变化。我倾向于尽可能靠近存储相关(读取模型)的数据库来实现查询。我在explore post 方面提到了这一点。您的域也不会实现数据存储,但会定义相关基础架构组件实现的存储库接口。查询和基于角色的访问控制 (RBAC) 是应用程序/集成层的关注点。
【解决方案2】:

我不确定您是否需要区分不同角色的帖子。在我的脑海中,这似乎是可行的:

  • 在对帖子的操作中包含角色作为参数,以便帖子可以拒绝客户编辑/删除帖子的尝试。

  • 通过用户路由操作,这将验证其角色允许该操作。

这些可以详细说明,也可以组合。

【讨论】:

  • 因此post 域可用于管理上下文和customer(阅读帖子)上下文。执行操作的权限由controller 处理。我理解正确吗?
  • 包含“一个角色”对于具有多个角色的用户来说会有问题,最好包含所有权限。但最好不要包含任何内容,而只使用另一个安全层来决定什么是允许的,什么是不允许的。
  • @WiktorZychla 所以我应该允许还是不允许在控制器层而不是域层中执行操作?
  • @NgọcNguyễn:是的,在我看来。您可以有一个单独的身份和访问控制有界上下文来处理授权,但两者的编排,授权和管理posts,是在控制器级别完成的。
  • @NgọcNguyễn:这个与帖子相关的帖子要么只是posts,我只能猜测,但我相信您在一个上下文中同时拥有帖子管理和评论。另一个是identity context
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 2023-01-29
  • 2011-10-13
  • 2011-02-04
  • 2017-06-06
  • 2015-01-06
  • 2016-09-29
  • 1970-01-01
相关资源
最近更新 更多