首先,我同意@ Yahia的评论,说没有一个普遍的答案。这就是说,这是我的方法。
首先,我可能会使用双重验证 - 一次在我的控制器中请求第一次收到时,然后在我的域中,因为它正在处理命令。有些人可能不同意这一点,但我宁愿阻止发布一个命令,并立即让用户知道他们没有被授权执行某些操作,而不是通过命令通过,并依靠最终一致性来处理某些错误通知以提醒用户在他们无法执行操作之后。
所以,在伪代码方面,这里是我的方式来编辑员工:
控制器
[HttpPost]
ActionResult Edit(Employee emp){
//get employee org information from _employeeRepository
//validate if _loggedInUserID is able to edit emp.ID
if(isValid) {
//construct command
_commandService.EnqueueCommand(new EditEmployee(emp.ID, emp.Name, emp.Salary));
} else {
return View("PermissionError");
}
return Redirect("EmployeeProperties");
}
所以在这里我的命令服务拿起命令,并将其路由到适当的AR在我的域中,这将是Employee。
员工域
protected void EditEmployee(userID, employeeID, employeeName, salary){
//get employee org information from _employeeRepository
//validate if userID is able to edit employeeID
if(isValid) {
//apply event
ApplyEvent(new EmployeeEdited(userID, employeeID, employeeName, salary));
}
}
所以我会采用同样的安全检查中我的两个控制器和我的域名。我想这可能是封装的方法(很可能是封装的标准类,我会传递到存储库)。
所以我希望这可以帮助我如何处理这种情况。让我知道是否有问题,我会在我的答案中详细说明。
我希望这会有所帮助。祝你好运!
IMO没有普遍的答案......我会一直在命令处理器端验证*至少*和**可选**“前期”(可能在接受消息进入队列的部分) – Yahia
我还认为区分真正的横切关注点,如认证,简单授权(该用户是否允许执行此类操作)很重要,从业务规则管理是否允许特定实体的某些操作。 –