2011-12-22 3 views
7

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

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

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

MySQL таблицы

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

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

ответ

8

В основном я бы придерживался одной из многих уже существующих библиотек 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

2

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

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

1

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

1

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

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

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

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

Смежные вопросы