作为MVC应该在哪个层应用权限的一部分?

时间:2009-07-16 18:36:20

标签: asp.net-mvc n-tier-architecture

MVC的哪个层(模型,视图,控制器)应该处理权限逻辑?

让我澄清一下。 显然,UI(视图和控制器)需要能够访问显示/隐藏组件的权限并处理权限被拒绝的场景。显然,权限应该由Model层持久保存到数据库。

但是这样的“复杂”许可规则呢? 在我正在开发的wiki / CMS系统中,每个用户都有一组每页权限(查看,编辑,重命名等)。对于现有页面,将从数据库中检索这些权限。对于新页面,假定用户具有所有可能的权限(因为他们创建/编辑它)。

另一个例子是页面列表:
当前用户应该只能在页面列表中查看他们具有查看权限的页面。

Controller应该处理这个逻辑吗?或者Controller应该只负责调用GetPermissions()方法(或GetPageList),并且在模型中处理填充它的所有逻辑?

2 个答案:

答案 0 :(得分:5)

控制对问题域实体的访问属于模型。这是合适的地方,因为(1)对域实体的访问控制与实体本身密切相关,(2)您可以确保没有两个控制器允许对同一对象使用不同的访问策略。

以下因素增加了一些混淆:

  1. 在控制器级别进行身份验证
  2. 一些工具和演示可用于轻松应用访问控制 - 在控制器层,例如: thisthisthat
  3. 它仍然属于该模型。

答案 1 :(得分:1)

模型应包含有关已登录用户的允许/拒绝权限的信息。然后控制器应根据模型允许/阻止操作。同时,视图应该只绘制与允许用户执行的操作相对应的链接。该视图将知道是否绘制某个链接询问模型(再次)。

您必须使用防御性编程:如果您不控制对控制器的操作访问权限,而不是为给定用户绘制链接,则仍允许该用户执行操作。另一方面,绘制将崩溃的动作的链接(如果仅检查控制器上的权限)将惹恼您的用户。