控制器或模型限制访问?

时间:2010-09-13 18:52:05

标签: asp.net-mvc authentication model controller

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

首先,我倾向于在控制器中执行此操作,因为他们“控制”系统的流程。但是,考虑到访问应该受到访问的数据的限制,而不是系统的逻辑部分,我觉得我真的应该选择模型。

现在我无法决定..我已经来回反复了几天而根本没有真正前进,所以现在我转向你,哦伟大的互联网,希望得到答案!< / p>

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

4 个答案:

答案 0 :(得分:5)

虽然可能存在例外情况,但访问控制应由控制器完成。

模型不应该包含任何程序功能,只需要业务逻辑。业务逻辑本身不应该是访问控制的。

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

实施例: 在Web应用程序中,模型“Person”包含“person”,并具有“createNew(name)”功能 Controller'PersonsController'有动作'addNewPerson()',它从HTTP Post读取名称并调用上面提到的函数。它还有一个访问规则,如果应用程序的当前状态表明请求操作的用户未登录,则可能无法调用操作'addNewPerson'。

答案 1 :(得分:1)

用户授权是严格基于会话的问题,因此最好在Controller中处理。使模型可以实现会话感知,但这是违反问题的,并且在我的经验中绝对不容易。您还必须担心请求是线程安全的,具体取决于您的技术堆栈。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

如果我们想要仅限于特定操作(例如用户不应该看到的某个页面)或在整个区域有限的情况下在控制器上定义,则可以为特定操作定义操作过滤器。

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

相关问题