问题的标题几乎恢复了:我在哪里验证命令的授权?
例如,将客户设置为首选涉及:
MarkAsPreferred
控制器动作(可能是 Winforms 或其他);SetCustomerAsPreferredCommand
;SetCustomerAsPreferredCommandHandler
;Customer.MarkAsPreferred()
(领域);
我确定了 3 个检查授权的地方:
- 用于显示目的的UI(如果他/她无权访问,则用户不应看到链接/按钮);
- 验证用户是否有权调用该命令的控制器操作;假设命令总是成功的(关于验证,但我也假设授权)并且我们有机会通知用户缺乏访问权限;
- 在调用域逻辑之前的命令内部;
SomeView.cshtml
if (authorizationService.Authorize("MarkCustomerAsPreferred))
{
// show link
}
客户控制器
[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 的建议包装命令以添加行为(授权、验证、日志记录)更容易实现。
我发现这篇博客文章准确地解释了这个概念。
关于一个命令有多个处理程序,我不需要为每个原始命令的每个行为实现一个命令处理程序,一个包装命令可以包装所有处理程序。