首先,我同意@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));
}
}
所以我会在我的控制器和我的域中应用相同的安全检查。我可能会将此作为封装方法(嗯,可能是我将传递给存储库的封装标准类)。
所以我希望这有助于我如何处理这种情况。如果有问题,请告诉我,我会在回答中详细说明。
我希望这有帮助。祝你好运!