2011-12-22 109 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的標準方式。