【问题标题】:Role based access control - correct MVC pattern基于角色的访问控制 - 正确的 MVC 模式
【发布时间】:2012-01-25 21:55:39
【问题描述】:

半年前开始使用MVC模式,至今仍有一些误解。

现在我想在我的应用程序中实现基于角色的访问控制。但是,我的问题不是关于 RBAC,而是关于 MVC。

我的 RBAC 实现是这样的: 用户->角色->权限 因此每个用户(例如 userA)可以拥有多个角色(例如 reader、editor、admin),并且每个角色都可以拥有多个权限(read、update、delete 等)。

MySQL 表

  • 用户(用户列表)
  • 角色(角色列表)
  • 权限(权限列表)
  • roles_permissions(角色列表->权限连接。例如编辑器->更新)
  • users_roles(用户列表->角色连接。例如 userA->editor)

现在我的问题是 我应该如何在 MVC 中实现它? 有一个单独的模型:用户、角色、权限、roles_permissions、users_roles,而不是有一个创建用户、角色、权限、roles_permissions 和 user_roles 的 authManager 类? 这种方式正确吗?有没有更好,或许更优雅的方式?

【问题讨论】:

    标签: php model-view-controller kohana rbac


    【解决方案1】:

    基本上,我会坚持使用许多已经存在的 Kohana ACL 库之一,而不是自己编写(或者至少尝试它们,看看它们是否符合您的需求)。

    您可能想查看此线程(Wouter A1、A2 和 ACL 模块)-http://forum.kohanaframework.org/discussion/1988/releases-a1-authentication-acl-acl-for-kohana-a2-object-level-authorization/p1
    它不断更新和维护,也可用于 3.2 版本。

    如果你觉得 Wouter 模块比较复杂,你也可以查看 Vendo ACL 模块,非常简单,消除了很多复杂性 - https://github.com/vendo/acl
    示例如何使用它 - http://forum.kohanaframework.org/discussion/9517/getting-started-with-vendo-acl/p1

    【讨论】:

      【解决方案2】:

      您通常需要为此使用 ACL 库/类,因为它是您描述的 ACL。我不知道 Kohana,但通过快速谷歌我发现了这个 Kohana ACL 库。 https://github.com/synapsestudios/kohana-acl

      但基本上,您确实需要模型来管理 ACL 库中的单独实体,例如用户、角色和权限。然后与控制器或其他库中的 ACL-api 对话以确定对应用特定部分的访问权限。

      【讨论】:

        【解决方案3】:

        假设我们已经包含 Zend_ACL,我正在复制/粘贴 KohanaPHP 的主应用程序控制器的代码。

        请注意我有基于用户的权限,而不是基于组的权限...虽然这可以很容易地编辑。

        <?php
        
        defined('SYSPATH') OR exit('No direct script access.');
        
        class Controller_Application extends Controller_Template
        {
        
            protected static $acl;
            public $template = 'default';
        
            public function before()
            {
                parent::before();
                session_start();
                self::$acl = new Zend_Acl();
                $this->set_permissions($_SESSION['userid']);
            }
        
            protected function check_access($resource, $privilege, $redirect = TRUE)
            {
                $permission = (self::$acl->has($resource) AND self::$acl->isAllowed($_SESSION['userid'], $resource, $privilege));
                if (!$permission AND $redirect)
                    $this->request->redirect('user/denied');
                elseif (!$permission AND !$redirect)
                    return FALSE;
                elseif ($permission AND !$redirect)
                    return TRUE;
            }
        
            protected function set_permissions($user_id)
            {
                $result = DB::select()
                    ->from('permissions')
                    ->where('user_id', '=', $user_id)
                    ->execute()
                    ->as_array();
                self::$acl->addRole(new Zend_Acl_Role($user_id));
                foreach ($result AS $permission)
                {
                    if (!self::$acl->has($permission['resource']))
                        self::$acl->add(new Zend_Acl_Resource($permission['resource']));
                    self::$acl->allow($user_id, $permission['resource'], $permission['privilege']);
                }
            }
        }
        
        ?>
        

        然后我检查控制器中的访问权限,如下所示:$this-&gt;check_access('events', 'add');

        【讨论】:

          【解决方案4】:

          我知道这条路很冷,但是突然出现了一个新项目:

          PHP-RBAC 是一个 PHP Hierarchical NIST Level 2 标准基于角色的访问控制,并且相当成熟。它也是一个 OWASP 项目。

          希望你喜欢http://phprbac.net

          它在 jframework 中的使用方式是将 RBAC 合并到 MVC 模式中的标准方式。

          【讨论】:

            猜你喜欢
            • 2010-09-11
            • 1970-01-01
            • 2013-08-28
            • 2013-05-08
            • 1970-01-01
            • 2011-11-02
            • 2015-12-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多