0

大型系统被许多用户使用,因此他们可以登录系统然后获得额外的权限。权限不同,例如查看其他用户详细信息的权限或执行不同操作的权限。软件开发的良好实践是使用设计模式。其中之一是 MVC(模型-视图-控制器)。所以,我的问题是:应该在模型的哪一层检查权限?该应用程序逻辑是否应该验证用户权限,或者在视图层中某些选项应该被隐藏/锁定/等?

4

1 回答 1

4

身份验证和授权不是 MVC 设计模式本身的一部分。它也不是任何基本 MVC 构建块的直接责任。

您可以探索的一个解决方案是将访问控制放在装饰器中。

您创建一个Container实例,您可以在其中注入一个对象(它可能是某个控制器、视图或模型层的服务)和一些授权管理器。然后你在这个容器上调用一个方法,就好像它是原始对象一样。如果访问管理器清除了呼叫,则执行该方法。否则,您会引发异常。

不幸的是,代码示例是用 PHP 编写的,因为那是我的“本机”语言

$something = new SomeThing;
$data = $something->getSensitiveData(); // will simply return all the information

$accessCheck = new AccessManager( .. some dependencies .. );
$something = new Container( $something, $accessCheck );
try 
{
    $data = $something->getSesitiveData(); 
    // will return all information if you pass the authorization.
} 
catch ( AccessDeniedException $e )
{
    // do something
}

这种方法有几个好处:

  1. 访问管理是集中的
  2. 您可以在此类容器中注入任何实例
  3. 不会导致 OCP 违规
  4. 让你在开发时延迟添加授权

这种装饰器中的“包装”通常发生在创建您的实例的工厂内。

至于你应该包装 MVC 三元组的哪一部分。嗯......通常包装控制器就足够了(尤其是在 Web 上下文中使用 MVC 时)。但是,根据您构建其余代码库的方式,为服务(模型层中的类/实例组)添加这种授权检查可能是合理的。

问题是,这种方法对粒度没有限制。您可以在任何对象上添加这种类型的访问控制。即使您无法访问该对象的源代码。

于 2013-01-31T16:28:40.253 回答