问题的标题重新开始:我在哪里验证命令的授权?
例如,将客户设置为首选包括:
MarkAsPreferred
控制器动作(可以是Winforms或其他);SetCustomerAsPreferredCommand
;SetCustomerAsPreferredCommandHandler
;Customer.MarkAsPreferred()
(域);
我确定了3个地方来检查授权:
- UI 用于显示目的(如果用户无法访问链接/按钮,则用户不应该看到它);
- 控制器动作 验证用户是否有权调用该命令;假设命令总是成功(关于验证,但我也假设授权),我们有机会告知用户缺乏访问权限;
- 在命令内 在调用域逻辑之前;
SomeView.cshtml
if (authorizationService.Authorize("MarkCustomerAsPreferred))
{
// show link
}
CustomerController
[HttpPost]
public ActionResult MarkAsPreferred(Guid id)
{
if (!authorizationService.Authorize("MarkCustomerAsPreferred))
{
return RedirectToAction("Unauthorized");
}
var MarkCustomerAsPreferredCommand { Id = id };
...
}
MarkCustomerAsPreferredCommandHandler
public void Handle(MarkCustomerAsPreferredCommand command)
{
if (!authorizationService.Authorize("MarkCustomerAsPreferred"))
{
throw new Exception("...");
}
customer.MarkAsPreferred();
}
我的问题是:我 需要 验证3个地方的授权或者我只是过分热心?
我搜索了整个互联网,但没有找到任何关于这个的例子或参考。
编辑
经过更多研究和一些测试后,我认为包装命令以添加行为(授权,验证,日志记录),如Dennis Taub所建议的那样,实施起来更容易,更清晰。
我发现 这篇博文 这恰恰解释了这个概念。
关于为一个命令提供多个处理程序,我不需要为每个原始命令的每个行为实现一个命令处理程序,一个包装命令可以包装所有处理程序。