【问题标题】:Limit access by Controller or by Model?通过控制器或模型限制访问?
【发布时间】:2010-09-13 18:52:05
【问题描述】:

我刚刚开始勾画基于 Web 的系统的基础,我希望管理员能够通过 Controller 或 Model 限制访问。我的问题是,我无法决定我应该选择哪一个(或两者?)。有任何想法吗?优点/缺点?

首先,我倾向于在控制器中执行此操作,因为它们“控制”了系统的流程。但后来想到访问可能应该受到它访问的数据的限制,而不是系统的逻辑部分,我觉得我真的应该使用模型。

现在我无法决定......我已经来回弹跳了几天,实际上根本没有前进,所以现在我求助于你,哦,伟大的互联网,希望得到答案!

我的实现是在 C# / ASP.NET / MVC2 中,但我仍在“理论上”工作,所以它并不是真正特定于框架的..

【问题讨论】:

  • 您是否希望根据授权和/或身份验证限制访问?那么是特定用户还是特定角色都可以访问网页?
  • 没错,是的!很可能是用户而不是角色,但不同的用户基本上可以访问同一系统的不同部分。

标签: asp.net-mvc authentication model controller


【解决方案1】:

虽然可能有例外,但访问控制应由控制器完成。

模型不应包含任何程序功能,而应仅包含业务逻辑。自身的业务逻辑不需要进行访问控制。

包含与此业务逻辑和模型“交互”的操作的控制器应该是进行访问控制的地方。一些框架已经提供了访问控制功能,可以评估应用程序的状态以决定是否可以执行某个动作。

示例: 在 Web 应用程序中,模型“Person”包含“persons”,并具有函数“createNew (name)” 控制器“PersonsController”具有操作“addNewPerson()”,它从 HTTP Post 读取名称并调用上述函数。它还有一个访问规则,如果应用程序的当前状态表明请求操作的用户未登录,则可能不会调用操作“addNewPerson”。

【讨论】:

    【解决方案2】:

    用户授权是一个严格基于会话的问题,因此最好在 Controller 中处理。使模型具有会话意识是可能的,但违反了关注点,并且根据我的经验绝对不容易。您还必须担心请求是线程安全的,具体取决于您的技术堆栈。

    Rails 应用程序通常处理此问题的方式是向 Controller 基类添加授权函数,并让您为整个控制器或需要授权请求的特定操作定义 before_filter。

    【讨论】:

      【解决方案3】:

      通常,我希望您的用户拥有可以访问他们可以在一系列模型上执行的一系列功能的角色。这种访问/禁止访问查找将在控制器中进行。

      【讨论】:

        【解决方案4】:

        在我正在进行的当前项目中,我们通过操作过滤器在控制器级别限制访问。

        如果我们想限制对特定操作的访问(例如用户不应该看到的某个页面),可以为特定操作定义操作过滤器,或者如果整个区域受到限制,可以在控制器上定义。

        动作过滤器本身非常简单,它使用 HttpContext 来查找用户的身份,但在我们的例子中,我们使用的是表单的身份验证,因此这可能会根据您使用的身份验证机制类型而有所不同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-15
          • 2021-03-14
          • 2016-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多