Php 基于角色的访问控制-正确的MVC模式

Php 基于角色的访问控制-正确的MVC模式,php,model-view-controller,kohana,rbac,Php,Model View Controller,Kohana,Rbac,半年前我开始使用MVC模式,但我仍然有一些误解 现在,我想在我的应用程序中实现基于角色的访问控制。然而,我的问题不是RBAC,而是MVC 我的RBAC实现是这样的: 用户->角色->权限 因此,每个用户(例如userA)都可以有许多角色(例如reader、editor、admin),每个角色都可以有许多权限(读取、更新、删除等) MySQL表 用户(用户列表) 角色(角色列表) 权限(权限列表) 角色\权限(角色列表->权限连接。例如编辑器->更新) 用户\角色(用户列表->角色连接。例如us

半年前我开始使用MVC模式,但我仍然有一些误解

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

我的RBAC实现是这样的: 用户->角色->权限 因此,每个用户(例如userA)都可以有许多角色(例如reader、editor、admin),每个角色都可以有许多权限(读取、更新、删除等)

MySQL表

  • 用户(用户列表)
  • 角色(角色列表)
  • 权限(权限列表)
  • 角色\权限(角色列表->权限连接。例如编辑器->更新)
  • 用户\角色(用户列表->角色连接。例如userA->编辑器)
现在我的问题是 我应该如何在MVC中实现这一点? 有一个单独的模型:用户、角色、权限、角色权限、用户角色,而没有一个创建用户、角色、权限、角色权限和用户角色的authManager类?
这样对吗?是否有更好、也许更优雅的方法?

您通常会希望使用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模式中的标准方式