2011-12-22 112 views
7

半年前我开始使用MVC模式,但仍然存在一些误解。基于角色的访问控制 - 正确的MVC模式

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

我RBAC的实施过程是这样: 用户>角色的>许可 所以每一个用户(例如用户A)可以有很多的角色,每一个角色可以(例如阅读器,编辑器,管理员。)有许多权限(读取,更新,删除等)。

MySQL表

  • 用户(用户列表)
  • 角色(角色列表)
  • 权限(许可列表)
  • roles_permissions(的roles-列表>权限连接。ex。editor-> update)
  • users_roles(用户列表 - >角色连接。ex。userA-> editor)

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

回答

8

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

你可能要检查这个线程(沃特A1,A2和ACL模块) - http://forum.kohanaframework.org/discussion/1988/releases-a1-authentication-acl-acl-for-kohana-a2-object-level-authorization/p1
它正在不断地更新和维护,它是适用于3.2版本,以及。

如果你觉得沃特模块是复杂的,你也可以检查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进行交谈,以确定对应用程序特定部分的访问权限。

1

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

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

<?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');

1

我知道的线索是冷,但一个新的项目已经弹出:

PHP-RBAC是一个PHP分层NIST二级标准基于角色的访问控制,并且已经相当成熟。这也是一个OWASP项目。

我希望你在http://phprbac.net

享受它,它被用来在jframework的方式,是在MVC模式结合RBAC的标准方式。