[英]Role based access control - correct MVC pattern
半年前我開始使用MVC模式,我仍然有一些誤解。
現在我想在我的應用程序中實現基於角色的訪問控制。 但是,我的問題不是關於RBAC,而是關於MVC。
我對RBAC的實現是這樣的: user-> role-> permission,因此每個用戶(例如userA)都可以擁有多個角色(例如閱讀器,編輯器,管理員),並且每個角色都可以擁有許多權限(讀取,更新,刪除,等等。)。
MySQL表
現在我的問題是我應該如何在MVC中實現它? 有一個單獨的模型:用戶,角色,權限,roles_permissions,users_roles,而不是具有創建用戶,角色,權限,roles_permissions和user_roles的authManager類? 這種方式是否正確? 有更好的,也許更優雅的方式嗎?
基本上我會堅持使用許多現有的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
您通常希望使用ACL庫/類,因為它是您描述的ACL。 我不知道Kohana但是從快速谷歌我發現了這個Kohana ACL庫。 https://github.com/synapsestudios/kohana-acl
但基本上你確實需要模型來管理ACL庫中的單獨實體,如用戶,角色和權限。 然后與控制器或其他庫中的ACL-api交談,以確定對應用程序特定部分的訪問權限。
我知道這條路很冷,但是出現了一個新項目:
PHP-RBAC是PHP分層NIST 2級標准基於角色的訪問控制,並且非常成熟。 它也是一個OWASP項目。
我希望你在http://phprbac.net上享受它
它以一種在MVC模式中結合RBAC的標准方式在jframework中使用。
假設我們已經包含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');
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.