7

半年前开始使用MVC模式,到现在还是有一些误解。

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

我对 RBAC 的实现是这样的: user->role->permission ,所以每个用户(例如 userA)可以有很多角色(例如 reader、editor、admin),每个角色可以有很多权限(read、update、delete、 ETC。)。

MySQL 表

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

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

4

4 回答 4

8

基本上,我会坚持使用许多已经存在的 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

于 2011-12-22T08:13:30.687 回答
2

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

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

于 2011-12-22T08:02:39.647 回答
1

假设我们已经包含 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->check_access('events', 'add');

于 2011-12-22T08:09:28.660 回答
1

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

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

我希望你喜欢它在http://phprbac.net

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

于 2013-02-28T13:34:10.943 回答