【问题标题】:Concern of Permission Check in DDDDDD 中的权限检查问题
【发布时间】:2020-04-29 12:51:47
【问题描述】:

我有一个使用 CQRS 的 Todo 应用程序。 我想检查执行创建/读取/更新操作的用户的一些权限。

给定

  • 我有2组OfficeKitchen
  • 每个TodoUser 都必须属于一个组
  • 每个用户都可以按照以下规则进行操作

规则

  • 用户可以阅读组中的 Todo(Office 中的 Todo 和 Office 中的用户)
  • 如果 Todo 不在他们的组中,用户将无法阅读该 Todo(Office 中的 Todo 和 Kitchen 中的用户)
  • 用户只能在其组中创建 Todo(用户在 Office 中,则 Todo 必须在 Office 中)
  • ...

表格Groups

| GroupId | GroupName |
|    1    |   Office  |
|    2    |   Kitchen |

表格Todo

| TodoId | GroupId |
|    1   |     1   |
|    2   |     1   |
|    3   |     2   |

表:User

|UserId | GroupId |
|  1    |    1    |
|  2    |    1    |
|  3    |    2    |

我想知道的

  • 应由哪一层负责检查上述规则(域、应用程序、基础架构)?
  • 当我们认为我们正在使用 CQRS(在控制器(动作)、实体、查询/命令处理程序中)时,将这个控件放在哪里更合适?

请告诉我你的想法。

谢谢。

【问题讨论】:

  • 我想这取决于你想要的复杂程度。显而易见的答案是,您希望基于命令的操作 CUD 位于命令端,而 R 位于读取端。层应该做他们正常做的事情,应用程序坐标,域包含规则。

标签: domain-driven-design cqrs


【解决方案1】:

应用程序(又名服务)应协调活动,域模型应包含规则。

其中一些可能取决于具体情况,但您可能会做这样的事情......

// Todo Command Service
public ResponseModel CreateTodoItem(CreateTodoItemCommand command, User user) {
  var userPermissionCheck = _userTodoCommandPermissions.GetPermissions(user, command.GroupId);

  if (!userPermissionCheck.CanCreate) {
    return ResponseModel.Failed();
  }

  // continue

} 

我会在同一个查询端做类似的事情。

就 CQRS 而言,我不确定是否真的需要摆脱服务层 - 但也许您的处理程序的设计方式可以处理这个问题。所以这有点取决于。

【讨论】:

    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多