簡體   English   中英

基於角色的訪問控制 - 正確的MVC模式

[英]Role based access control - correct MVC pattern

半年前我開始使用MVC模式,我仍然有一些誤解。

現在我想在我的應用程序中實現基於角色的訪問控制。 但是,我的問題不是關於RBAC,而是關於MVC。

我對RBAC的實現是這樣的: user-> role-> permission,因此每個用戶(例如userA)都可以擁有多個角色(例如閱讀器,編輯器,管理員),並且每個角色都可以擁有許多權限(讀取,更新,刪除,等等。)。

MySQL表

  • 用戶(用戶列表)
  • 角色(角色列表)
  • 權限(權限列表)
  • roles_permissions(角色列表 - >權限連接。例如編輯器 - >更新)
  • users_roles(用戶列表 - >角色連接。例如用戶A->編輯器)

現在我的問題是我應該如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM