【发布时间】:2013-06-14 03:10:08
【问题描述】:
问题的标题几乎恢复了:我在哪里验证命令的授权?
例如,将客户设置为首选涉及:
-
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 的建议封装命令以添加行为(授权、验证、日志记录)更容易实现。
我找到了this blog post,它准确地解释了这个概念。
关于一个命令有多个处理程序,我不需要为每个原始命令的每个行为实现一个命令处理程序,一个包装命令可以包装所有处理程序。
【问题讨论】:
标签: authorization cqrs