Php 基于角色的访问控制-正确的MVC模式
半年前我开始使用MVC模式,但我仍然有一些误解 现在,我想在我的应用程序中实现基于角色的访问控制。然而,我的问题不是RBAC,而是MVC 我的RBAC实现是这样的: 用户->角色->权限 因此,每个用户(例如userA)都可以有许多角色(例如reader、editor、admin),每个角色都可以有许多权限(读取、更新、删除等) MySQL表Php 基于角色的访问控制-正确的MVC模式,php,model-view-controller,kohana,rbac,Php,Model View Controller,Kohana,Rbac,半年前我开始使用MVC模式,但我仍然有一些误解 现在,我想在我的应用程序中实现基于角色的访问控制。然而,我的问题不是RBAC,而是MVC 我的RBAC实现是这样的: 用户->角色->权限 因此,每个用户(例如userA)都可以有许多角色(例如reader、editor、admin),每个角色都可以有许多权限(读取、更新、删除等) MySQL表 用户(用户列表) 角色(角色列表) 权限(权限列表) 角色\权限(角色列表->权限连接。例如编辑器->更新) 用户\角色(用户列表->角色连接。例如us
- 用户(用户列表)
- 角色(角色列表)
- 权限(权限列表)
- 角色\权限(角色列表->权限连接。例如编辑器->更新)
- 用户\角色(用户列表->角色连接。例如userA->编辑器)
这样对吗?是否有更好、也许更优雅的方法?您通常会希望使用ACL库/类来实现此目的,因为您正在描述的是ACL。我不知道Kohana,但通过快速的谷歌搜索,我找到了这个Kohana ACL库
但基本上,您确实需要模型来管理ACL库中的单独实体,如用户、角色和权限。然后与控制器或其他库中的ACL api交谈,以确定对应用程序特定部分的访问。我正在复制/粘贴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')代码>基本上,我会坚持使用许多已有的Kohana ACL库中的一个,而不是编写自己的库(或者至少尝试一下它们是否适合您的需要)
您可能需要检查此线程(Wouter A1、A2和ACL模块)-
它正在不断更新和维护,3.2版也可以使用
如果您觉得Wouter模块比较复杂,您也可以检查Vendo ACL模块,该模块非常简单,消除了许多复杂问题-
示例如何使用它-我知道线索很冷,但出现了一个新项目:
PHP-RBAC是一种PHP层次结构的NIST 2级标准基于角色的访问控制,非常成熟。它也是一个OWASP项目
我希望你在这里玩得开心
它在jframework中的使用方式是将RBAC合并到MVC模式中的标准方式