首先,我同意@ 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
我還認爲區分真正的橫切關注點,如認證,簡單授權(該用戶是否允許執行此類操作)很重要,從業務規則管理是否允許特定實體的某些操作。 –