代码之家  ›  专栏  ›  技术社区  ›  meandmycode

应用程序中应在何处处理辅助数据(如授权/身份)

  •  0
  • meandmycode  · 技术社区  · 17 年前

    创建网站时,我的模式通常如下所示:

    1. 服务(域服务、基础设施服务)
    2. 存储库

    控制器与域服务或基础设施服务对话,域服务可能与存储库对话,基础设施服务将封装smtp等内容。

    目前,我将身份作为基础设施服务来处理,如果基础设施服务或域服务需要找出“调用方是谁”,它将在构造时请求身份服务,身份服务将具有标识调用方的方法/属性,这样我就有了HttpIdentityService,它通过会话/cookie数据确定标识。

    public ActionResult AddComment(int articleId)
    {
      string commentText = ...;
      articleService.CreateComment(articleId, commentText);
      ...
    }
    

    但是,如果当前标识未经授权,或者未通过ArticleService检查的策略(例如,可能每30秒就可以进行一次注释),则此方法可能会失败,从服务调用中抛出和捕获异常,这似乎是非常错误的,因为我的调用代码无法检查它是否能够成功调用此操作(除了致命的应用程序异常)。。

    我的推理是,应用程序服务不应该控制某个操作是否应该调用,想象一下,如果我将所有用户身份检查和所有内容移出域服务并移入应用程序服务,我将有大量的复制代码,以及让应用程序服务完全控制可能发生的事情。。

    我想我的问题基本上是,考虑到这个域,基础设施服务将执行额外的策略,通知调用代码操作成功与否的最佳方式是什么,以及为什么。

    2 回复  |  直到 17 年前
        1
  •  0
  •   Jens Schauder    17 年前

    使用面向方面的编程检查权限。如果这些失败,则抛出异常。

    在实际调用某个操作之前,请检查是否具有必要的权限。如果没有,请取消操作。

    如果某个操作具有某些需要特殊权限的可选任务,请在执行可选任务之前检查必要的权限,并根据业务规则作出反应。如果您忘记执行检查,您的aop代码将执行检查并抛出一个异常,这是可以的,因为它真的不应该出现这种情况。

        2
  •  0
  •   Manrico Corazzi    17 年前

    在类似的情况下,我使用方面检查方法调用是否已授权,如果未授权,则抛出AuthorizationException。方面截获了方法调用,从会话中检索了用户信息,检查了角色/权限集,并最终抛出了异常。通过这种方式,调用代码可以处理异常,向用户提供有意义的反馈,记录事件,等等。