【发布时间】:2013-10-27 17:59:00
【问题描述】:
我已经为不同的 MVC 框架做了大量的教程,而且在控制器中进行授权似乎很典型。为什么?
我的想法是控制器应该只用于编排模型操作、处理重定向和处理错误事件。这些是依赖于特定请求的东西。将授权放在控制器中似乎每当您在不同的控制器操作或不同的控制器中使用相同的模型操作时,您都必须复制授权。如果 Auth 在模型中,则您对数据执行操作或状态更改具有一致的要求。
我一直在谷歌搜索并查看其他问题,例如 Should authorization be part of the model or controller?,但我真的不明白为什么这是公认的约定。
将授权放在模型上的控制器中是否有我遗漏的特定原因?
在cmets中总结点:
- 控制器负责改变模型层和当前视图的状态。没有别的了。
- 授权属于执行操作的地方,如果您遵循严格的 MVC 模式,这很可能是模型,并且控制器当然不负责授权使用模型操作。
- 应该像对待任何其他数据存储一样对待 Cookie:在模型中抽象和使用,而不是直接由控制器使用。
- 身份验证和授权是单独的问题,尽管它们通常都进入模型层,因为它们通常涉及对数据存储区中的值(例如 cookie)的检查。
【问题讨论】:
-
我想说,neither 控制器和模型层都不应该与授权检查有关。人们大多将其转储到“控制器”中,因为在使用类似 Rails 的架构时,他们会在那里转储其他所有内容。
-
我正在使用一个有授权规则的类,但你实际上在哪里执行?如果不在控制器或模型中,你在哪里说“要这样做,你必须通过这些规则”?
-
嗯。我在您的评论中读到有规则。我想说的是,这些规则应该已经为您提供了一些与它们相关的指针。
-
@Charles ,我实际上认为授权(就像记录用户操作一样)应该是“高于”实例,它会影响。假设您要验证用户是否可以访问
AdminPanel::deleteEverything()。应用程序初始化AdminPanel实例以检查用户是否有权访问该类中的方法是否有意义?另一方面:如果您更改某些身份验证过程,您是否必须手动检查所有类,看看是否不会有任何问题?在我看来,这种方法会违反 SRP 和 OCP。 -
如果不在模型或控制器中,它会去哪里?对我来说,在他们自己的类中有授权规则,并有一个模型操作调用,比如 $this->auth->requireAdmin(..); 是有意义的。如果您想更改需要管理员的身份验证规则,它在一个地方。
标签: model-view-controller model controller authorization