2011-12-22 66 views
7

Empecé a utilizar el patrón MVC hace medio año y todavía tengo algunos malentendidos.Control de acceso basado en roles: patrón MVC correcto

Ahora quiero implementar un control de acceso basado en funciones en mi aplicación. Sin embargo, mi pregunta no es sobre RBAC, se trata de MVC.

Mi implementación de RBAC es la siguiente: usuario-> roles> permiso por lo que cada usuario (por ejemplo userA.) Puede tener muchos papeles, y cada papel puede (ex lector, editor, Admón.) tener muchos permisos (leer, actualizar, eliminar, etc.).

tablas MySQL

  • usuarios (lista de usuarios)
  • funciones (lista de roles)
  • permisos (lista de permiso)
  • roles_permissions (lista de roles-> conexiones de permisos ej. editor-> actualización)
  • users_roles (lista de usuarios-> roles conexiones, por ejemplo, userA-> editor)

Ahora mi pregunta es ¿Cómo debo implementar esto en MVC? Tenga un modelo separado para: usuarios, roles, permisos, roles_permissions, users_roles, que tengan una clase authManager que cree usuarios, roles, permisos, roles_permissions y user_roles. ¿Es así? ¿Hay una manera mejor, quizás más elegante?

Respuesta

8

Básicamente me quedaría con una de las muchas bibliotecas Kohana ACL existentes en lugar de escribir la suya (o al menos pruébelas para ver si se ajustan a sus necesidades).

Es posible que desee comprobar este hilo (módulos Wouter A1, A2 y ACL) - http://forum.kohanaframework.org/discussion/1988/releases-a1-authentication-acl-acl-for-kohana-a2-object-level-authorization/p1
Está siendo constantemente actualizado y mantenido y está disponible para la versión 3.2 también.

Si se siente módulos Wouter son complicadas, también se puede comprobar módulo Vendo ACL que es muy simple y elimina una gran cantidad de complicaciones - https://github.com/vendo/acl
Ejemplos Cómo utilizar los que - http://forum.kohanaframework.org/discussion/9517/getting-started-with-vendo-acl/p1

2

Por lo general, querrá utilizar una biblioteca/clase ACL para esto ya que es la ACL que está describiendo. No conozco Kohana, pero de un Google rápido encontré esta biblioteca Kohana ACL. https://github.com/synapsestudios/kohana-acl

Pero básicamente necesitará modelos para administrar sus entidades separadas en las bibliotecas de ACL como usuarios, roles y permisos. Luego, hable con la ACL-api en sus controladores u otras bibliotecas para determinar el acceso a partes específicas de su aplicación.

1

Copio/pego el código del controlador de aplicación principal de KohanaPHP asumiendo que ya tenga Zend_ACL incluido.

Tenga en cuenta que tengo permisos basados ​​en el usuario, no en uno basado en grupos ... Aunque esto se puede editar fácilmente.

<?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']); 
     } 
    } 
} 

?> 

Entonces comprobación de acceso en los controladores de esta manera: $this->check_access('events', 'add');.

1

Sé que el camino está fría , pero ha aparecido un nuevo proyecto:

PHP-RBAC es un control de acceso basado en funciones estándar jerárquico NIST nivel 2 de PHP y es bastante maduro. También es un proyecto OWASP.

espero que lo disfruten al http://phprbac.net

se utiliza en jframework de una manera que es la forma estándar de la incorporación de RBAC en un patrón MVC.

Cuestiones relacionadas