2

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

让我澄清一下。显然,UI(视图和控制器)需要能够访问权限以显示/隐藏组件并处理权限被拒绝的情况。很明显,权限应该由模型层持久化到数据库中。

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

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

控制器应该处理这个逻辑吗?还是应该 Controller 只负责调用 GetPermissions() 方法(或 GetPageList),而填充它的所有逻辑都在 Model 中处理?

4

2 回答 2

5

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

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

  1. 身份验证发生在控制器级别
  2. 一些工具和演示可用于轻松应用访问控制——在控制器层,例如thisthisthat

它仍然属于模型。

于 2009-07-16T18:49:53.533 回答
1

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

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

于 2009-07-16T18:48:02.257 回答