ACL Configurado a Traves de un Archivo ini

De KumbiaPHP Framework Wiki


{{#if: |}}

{{#if:

|}}




Descripción

A traves de este tutorial podemos ver como se puede trabajar una lista de control de acceso por medio de un archivo .ini , haciendo asi mas facil configurar los roles y los privilegios de los mismos en una aplicacion.

Nos basaremos en el uso de la libreria Acl2 de KumbiaPHP.

Creando una libreria para manejar las listas de control de acceso

Esta clase nos permitira llevar un control de los distintos tipos de usuario a travez de un archivo.ini, la clase se llamará MyAcl y estará hubicada en el directorio: proyecto/app/libs/my_acl.php

<?php

class MyAcl {

    /**
     *
     * @var SimpleAcl
     */
    protected $_acl = null;

    /**
     * arreglo con los templates para cada usuario
     *
     * @var array 
     */
    protected $_templates = array();

    public function __construct($archivo = 'privilegios') {
        $config = Config::read($archivo, true);

        $this->_acl = Acl2::factory();

        $this->_establecerRoles($config['roles']);

        foreach ($config['roles'] as $rol => $padres) {
            $recursos = $config[$rol];
            $this->_establecerPermisos($rol, $recursos);
        }

        $this->_establecerTemplates($config['templates']);
    }

    protected function _establecerRoles($roles) {

        foreach ($roles as $rol => $padres) {
            $this->_acl->user($rol, array($rol));
            if ($padres) {
                $padres = explode(',', $padres);
                $padres = is_array($padres) ? $padres : array($padres);
                $this->_acl->parents($rol, $padres);
            }
        }
    }

    protected function _establecerPermisos($rol, $recursos) {
        $urls = array();
        foreach ($recursos as $recurso => $acciones) {
            if ($acciones == '*') {
                $urls[] = "$recurso/*";
            } else {
                foreach (explode(',', $acciones) as $accion) {
                    $urls[] = "$recurso/$accion";
                }
            }
            $this->_acl->allow($rol, $urls);
        }

        if (empty($recursos)) {
            $urls[] = "*";
            $this->_acl->allow($rol, $urls);
        }
    }

    public function check($usuario, $modulo, $controlador, $accion) {
        if ( isset ($this->_templates["$usuario"]) ){
            View::template("{$this->_templates["$usuario"]}");
        }
        if ($modulo) {
            $recurso1 = "$modulo/$controlador/$accion";
            $recurso2 = "$modulo/$controlador/*";  //por si tiene acceso a todas las acciones
            $recurso3 = "*";  //por si tiene acceso a todo el sistema
        } else {
            $recurso1 = "$controlador/$accion";
            $recurso2 = "$controlador/*"; //por si tiene acceso a todas las acciones
            $recurso3 = "*";  //por si tiene acceso a todo el sistema
        }
        return $this->_acl->check($recurso1, $usuario) ||
        $this->_acl->check($recurso2, $usuario) ||
        $this->_acl->check($recurso3, $usuario);
    }

    protected function _establecerTemplates($templates){
        foreach ($templates as $rol => $template){
            $this->_templates["$rol"] = $template ;
        }
    }

}

Descripcion y uso de la libreria MyAcl

La libreria MyAcl se encarga de controlar los accesos de los usuarios en la aplicacion, verificando si cada usuario tiene los permisos necesarios para acceder ó no a ciertos modulos de la misma.


El Archivo .INI

La clase MyAcl necesita de un archivo .ini para crear el control de los accesos en la aplicacion, aqui tenemos un ejemplo de un archivo ini basico, (proyecto/app/config/privilegios.ini) :

[roles] ; tipos de usuario que exisitirán en la aplicacion
alumno = null   ;un rol alumno que no extiende de ningun otro rol
administrador = usuario  ; un rol usuario que extiende de alumno, con lo que obtiene sus privilegios

; a partir de aca se definiran los privilegios por cada rol

[alumno]  ;rol alumno
index = * ;puede entrar al controlador index y a todas sus acciones
menu = *  ;puede entrar al controlador menu y a todas sus acciones
admin/usuarios = index,agregar ; puede entrar al modulo admin , controlador usuarios acciones index y agregar solamente
reportes = * ;puede entrar a todas las vistas del controlador reportes

[administrador] ;rol administrador
; si la categoria del rol no tiene valores, se le dan todos los permisos por defecto


; aqui se definen los templates a usar por cada rol que se haya creado
[templates]
alumno = alumno
administrador = admin
<?php

/**
 * Todas las controladores heredan de esta clase en un nivel superior
 * por lo tanto los metodos aqui definidos estan disponibles para
 * cualquier controlador.
 *
 * @category Kumbia
 * @package Controller
 * */
// @see Controller nuevo controller
require_once CORE_PATH . 'kumbia/controller.php';

class AppController extends Controller {


    final protected function initialize() {
        $this->validar_sesion();
    }

    protected function validar_sesion() {
         $acl = new MyAcl();
         $modulo = $this->module_name;
         $controlador = $this->controller_name;
         $accion = $this->action_name;
         $privilegio = Auth::get('privilegio');
         if (!$acl->check($privilegio, $modulo, $controlador, $accion)) {
             Flash::error("No posees suficientes PRIVILEGIOS para acceder a: {$modulo}/{$controlador}/{$accion}");
             $this->tiene_permiso = false;
         }
    }

}



Realizado por: Manuel Aguirre (manuel_j555)