为什么auth通常位于MVC的Controller中?

Cha*_*les 7 model-view-controller authorization controller model

我一直在为不同的MVC框架做很多教程,看起来很常见的是在Controller中进行授权.为什么?

我的想法是Controller应该只用于编排模型操作,处理重定向和处理错误事件.这些是依赖于特定请求的事情.将授权放入Controller中似乎只要在不同的Controller操作或不同的控制器中使用相同的Model操作时,您就必须复制授权.如果Auth在模型中,则对数据执行操作或状态更改有一致的要求.

我一直在谷歌搜索并查看其他问题,例如应该授权是模型还是控制器的一部分?但我真的不明白为什么它是公认的惯例.

是否有一个特定的原因我错过了将控制权放在控制器上的模型?

总结评论中的要点:

  • 控制器负责更改模型层和当前视图的状态.没有其他的.
  • 授权属于正在执行操作的位置,如果您遵循严格的MVC模式,这很可能是模型,并且Controller当然不负责授权使用模型操作.
  • Cookie应该像任何其他数据存储一样对待:在模型中抽象和使用,而不是直接由控制器.
  • 身份验证和授权是单独的问题,尽管它们通常都在模型层中,因为它们通常涉及检查数据存储中的值(例如cookie).

hak*_*kre 8

是否有一个特定的原因我错过了将控制权放在控制器上的模型?

嗯,我能想象的最常见的原因是懒惰.我并不是说在道德上,将一些授权概念放在一个更接近具体请求的层上,然后在模型层上进行差异化访问就更容易了.获得模型授权是一个更高的设计.

为了给答案添加一些更实用的建议,我认为你应该分析每个程序在哪里以及你想要引入什么授权.对此的需求可能(非常)不同.

然后,只有在下一步中,您应该考虑哪种设计最有利于引入授权和身份验证以满足这些需求.


Dmi*_*tri 1

授权作为一个完整的过程应该涉及控制器层和模型层。

但是,所有 logc(SQL 查询等)肯定应该发生在模型中。控制器是视图(表示)和模型之间的中间层。但是,您根本不能从该方案中丢弃控制器,因为控制器负责处理会话和 Cookie。如果没有这两件事,您的所有身份验证/授权逻辑都是无用的,因为它本质上是无状态的。会话和 Cookie 为其带来状态。此外,正如您正确提到的,控制器负责重定向。

  • -1:控制器不在模型和视图之间进行中介,控制器与会话和cookie无关(这些是存储形式)。此外,身份验证和授权是单独的职责。重定向是响应的一种形式。它是一个仅包含 HTTP Location 标头的“输出”。 (3认同)