【问题标题】:Where is it better to validate owner of some document?验证某些文档的所有者在哪里更好?
【发布时间】:2012-10-30 15:37:18
【问题描述】:

我们有一个 WCF 服务,该服务具有一种方法,例如,通过给定 id 取消订单。 我们网站的任何用户都可以从网络上调用此方法。

在这个方法的某个地方,我们必须检查具有给定 ID 的订单是否属于当前登录的用户(我们读取授权 cookie)。

在哪里执行此检查更好?

在 WCF 方法中,我们启动业务流程,并在其中某处要求存储库按 id 加载订单。

我们可以有许多这样的对网络开放的操作。而且我想让忘记做这样的所有权检查的可能性尽可能低——我想在每个代码分支都会去的某个狭窄的地方实施这样的检查。

我可以在存储库中进行这样的检查,但我现在确信这种验证是它的责任。 此外,我可以通过将行为属性应用于服务或其操作来实现某种声明性验证,但我不确定这是正确的地方,因为我们必须至少加载订单两次 - 首先是在执行所有权时测试,然后在业务流程中。

【问题讨论】:

    标签: architecture application-design


    【解决方案1】:

    每个服务都有责任作为安全边界。因此,服务方法应该在调用必要的业务逻辑之前对其输入参数执行一次验证调用。最重要的是,你应该总是快速失败——如果方法调用无论如何都会失败,请确保它尽快失败(另见http://en.wikipedia.org/wiki/Fail-fast)。

    因此,让您的服务方法调用验证方法(为每个服务方法编写一个验证器类),该方法可以在不允许执行某项操作时抛出验证异常,或返回状态码。异常通常是首选,因为它们会停止执行并强制调用堆栈对其进行操作。

    验证方法的工作原理是另一回事。它可能会调用存储库并询问交易的所有者是谁。无论您如何实现它,其工作原理都隐藏在验证器类中。

    【讨论】:

      猜你喜欢
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多