Управление доступом на основе ролей - правильный шаблон MVC - PullRequest
7 голосов
/ 22 декабря 2011

Я начал использовать шаблон MVC полгода назад, и у меня все еще есть некоторые недоразумения.

Теперь я хочу реализовать контроль доступа на основе ролей в моем приложении. Однако мой вопрос не о RBAC, а о MVC.

Моя реализация RBAC такова: user-> ролевая> разрешение поэтому каждый пользователь (например, userA) может иметь много ролей (например, читатель, редактор, администратор), и каждая роль может иметь много разрешений (чтение, обновление, удаление и т. д.).

Таблицы MySQL

  • пользователи (список пользователей)
  • ролей (список ролей)
  • разрешения (список разрешений)
  • role_permissions (список ролей-> разрешений соединений. Например, редактор-> update)
  • users_roles (список соединений пользователей-> ролей. Например, userA-> editor)

Теперь мой вопрос Как я должен реализовать это в MVC? У вас есть отдельная модель для: пользователи, роли, разрешения, role_permissions, users_roles, чем класс authManager, который создает пользователей, роли, разрешения, role_permissions и user_roles? Это правильно? Есть ли лучший, может быть, более элегантный способ?

Ответы [ 4 ]

8 голосов
/ 22 декабря 2011

По сути, я бы придерживался одной из многих уже существующих библиотек ACH Kohana вместо того, чтобы писать свою собственную (или, по крайней мере, попробовать их, чтобы увидеть, соответствуют ли они вашим потребностям).

Вы можете проверить эту тему (модули 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 сложны, вы также можете проверить модуль ACL Vendo, который очень прост и устраняет множество сложностей - https://github.com/vendo/acl
Примеры как это использовать - http://forum.kohanaframework.org/discussion/9517/getting-started-with-vendo-acl/p1

2 голосов
/ 22 декабря 2011

Обычно вы хотите использовать для этого библиотеку / класс ACL, поскольку вы описываете ACL.Я не знаю Kohana, но из быстрого Google я нашел эту библиотеку ACL Kohana.https://github.com/synapsestudios/kohana-acl

Но в принципе вам действительно понадобятся модели для управления отдельными объектами в библиотеках ACL, такими как пользователи, роли и разрешения.Затем поговорите с ACL-api в своих контроллерах или других библиотеках, чтобы определить доступ к определенным частям вашего приложения.

1 голос
/ 28 февраля 2013

Я знаю, что тропа холодная, но появился новый проект:

PHP-RBAC - это стандартное управление доступом на основе ролей, стандартное иерархическое управление уровнями NIST уровня 2, и он достаточно развит. Это также проект OWASP.

Надеюсь, вам понравится http://phprbac.net

он используется в jframework таким образом, который является стандартным способом включения RBAC в шаблон MVC.

1 голос
/ 22 декабря 2011

Я копирую / вставляю код основного контроллера приложений 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');.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...