【问题标题】:User permission in MVC design patternMVC 设计模式中的用户权限
【发布时间】:2013-01-31 14:21:55
【问题描述】:

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

【问题讨论】:

标签: model-view-controller design-patterns permissions


【解决方案1】:

身份验证和授权不是 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 时)。但是,根据您如何构建代码库的其余部分,为服务(模型层中的类/实例组)添加这种授权检查可能是合理的。

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

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 2013-03-25
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2011-01-21
    • 2014-11-22
    相关资源
    最近更新 更多