关注DDD的权限检查

问题描述 投票:0回答:1

我有一个使用CQRS的Todo应用程序,我想检查执行CreateReadUpdate操作的用户的一些权限。

给定:

  • 我有2个小组 OfficeKitchen
  • 每个 TodoUser 属于一个群体
  • 每个用户可以根据以下规则进行操作

规则:

  • 如果一个用户的Todo在他们的组中,他就可以读取该Todo(Todo in Office & User in Office)。
  • 如果用户不在其组中,则不能读取Todo(Todo in Office & User in 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时,把这个控制放在哪里更合适(在控制器(动作)中,在实体中,在查询命令处理程序中)?

请把你的想法告诉我。

谢谢您。

domain-driven-design cqrs
1个回答
0
投票

应用(也就是服务),应该协调活动,而域模型应该包含规则。

其中一些可能取决于具体的细节,但你可以做这样的事情......

// 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而言,我不确定是否真的需要摆脱服务层--但也许你的处理程序的设计方式就是为了处理这个问题。所以这有点取决于。

© www.soinside.com 2019 - 2024. All rights reserved.