Diferencia entre revisiones de «ACL Configurado a Traves de un Archivo ini»

De KumbiaPHP Framework Wiki
 
(No se muestran 17 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
[[Categoría:Tutoriales KumbiaPHP]]
 
 
 
{{cleanupbox
 
{{cleanupbox
|texto ='''Este Tutorial se encuentra actualmente en proceso de edición'''
+
|texto ='''Este ejemplo es funcional para la [[KumbiaPHP_Framework_Versión_1.0_Beta2| Versión Beta2]]'''
 
}}
 
}}
 
 
  
 
=== Descripción ===
 
=== 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 usuarios en una aplicacion.
+
A traves de este tutorial podemos ver como se puede trabajar una lista de control de accesos por medio de un archivo .ini , haciendo así mas facil configurar los roles y los privilegios de los usuarios en una aplicacion.
  
Nos basaremos en el uso de la libreria '''Acl2''' de KumbiaPHP.
+
Nos basaremos en el uso de la librería '''Acl2''' de KumbiaPHP.
  
=== Libreria para manejar las listas de control de acceso ===
+
=== Librería 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'''
+
Esta clase nos permitirá llevar un control de los distintos tipos de usuario a traves de un archivo .ini, la clase se llamará '''MyAcl''' y estará ubicada en el directorio: '''proyecto/app/libs/my_acl.php'''
  
 
<source lang=php>
 
<source lang=php>
Línea 109: Línea 105:
 
</source>
 
</source>
  
==== Descripcion y uso de la libreria MyAcl ====
+
==== Descripción y uso de la librería 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, todo ellos segun los criterios establecidos en el archivo ini.
 
  
 +
La librería '''MyAcl''' se encarga de controlar los accesos de los usuarios en la aplicación, verificando si cada usuario tiene los permisos necesarios para acceder ó no a ciertos módulos de la misma, todo ellos segun los criterios establecidos en el archivo ini.
  
 
=== El Archivo .INI ===
 
=== 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 básico, ('''proyecto/app/config/privilegios.ini''') :
+
La clase MyAcl necesita de un archivo .ini para crear el control de los accesos en la aplicación, aquí tenemos un ejemplo de un archivo ini básico, ('''proyecto/app/config/privilegios.ini''') :
  
 
<source lang=ini>
 
<source lang=ini>
Línea 122: Línea 117:
 
[roles] ; tipos de usuario que exisitirán en la aplicacion
 
[roles] ; tipos de usuario que exisitirán en la aplicacion
 
alumno = null  ;un rol alumno que no extiende de ningun otro rol
 
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
+
administrador = alumno ; un rol usuario que extiende de alumno, con lo que obtiene sus privilegios
  
 
; a partir de aca se definiran los privilegios por cada rol
 
; a partir de aca se definiran los privilegios por cada rol
Línea 141: Línea 136:
  
 
</source>
 
</source>
 +
  
 
La estructura del archivo ini es muy sencilla, en primer lugar existe una sección llamada '''roles''', en la cual se definen cada uno de los distintos tipos de usuarios que va a tener la aplicación.
 
La estructura del archivo ini es muy sencilla, en primer lugar existe una sección llamada '''roles''', en la cual se definen cada uno de los distintos tipos de usuarios que va a tener la aplicación.
 +
  
 
==== Definiendo los Roles ====
 
==== Definiendo los Roles ====
En el ejemplo se han definido dos roles, uno llamado '''alumno''' y otro llamado '''administrador''', el rol "alumno" tiene un valor "null" lo que significa que no hereda privilegios de ningun otro rol, mientras que el rol '''administrador''' tiene como valor "alumno" con lo cual estamos indicando que administrador va a heredad todos los privilegios de alumno.
+
En el ejemplo se han definido dos roles, uno llamado '''alumno''' y otro llamado '''administrador''', el rol "alumno" tiene un valor "null" lo que significa que no hereda privilegios de ningun otro rol, mientras que el rol '''administrador''' tiene como valor "alumno" con lo cual estamos indicando que administrador va a heredad todos los privilegios de alumno (si un rol hereda de varios roles, simplemente deben escribirse cada uno separados por coma: mi_rol =  rol_1,rol_2,ro_3 ).
 +
 
  
 
==== Definiendo los Recursos ====
 
==== Definiendo los Recursos ====
 
Las siguientes secciones variaran de acuerdo a los roles existentes en la aplicación, es decir, si existen tres roles, deberán haber tres secciones cada una con el nombre de un rol, en el ejemplo existen dos secciones para los roles, una sección llamada '''[alumno]''' y otra llamada '''[administrador]''', y en cada una de ellas se han definido los recursos a los cuales pueden acceder.
 
Las siguientes secciones variaran de acuerdo a los roles existentes en la aplicación, es decir, si existen tres roles, deberán haber tres secciones cada una con el nombre de un rol, en el ejemplo existen dos secciones para los roles, una sección llamada '''[alumno]''' y otra llamada '''[administrador]''', y en cada una de ellas se han definido los recursos a los cuales pueden acceder.
  
En el caso del rol '''[alumno]''' se han definidon definido tres recursos, '''index = *''' (significa que alumno puede acceder al controlador index, y el asterisco indiaca que puede acceder a todas las vistas de dicho controlador) , '''menu = *''' (puede entrar al controlador menu, siempre y cuando se acceda a alguna de las vistas indicadas [index,consultas,reportes]) , y por ultimo '''admin/usuarios''' ( puede entrar al modulo admin, controlador usuarios, acciones index y agregar ).
+
En el caso del rol '''[alumno]''' se han definidon definido tres recursos, '''index = *''' (significa que alumno puede acceder al controlador index, y el asterisco indica que puede acceder a todas las vistas de dicho controlador) , '''menu = *''' (puede entrar al controlador menu, siempre y cuando se acceda a alguna de las vistas indicadas [index,consultas,reportes]) , y por ultimo '''admin/usuarios''' ( puede entrar al modulo admin, controlador usuarios, acciones index y agregar ).
 +
 
 +
El rol '''[administrador]''' no tiene ningun recurso establecido en el archivo .ini, con lo cual estamos diciendo que administrador tiene privilegios para entrar a todos los modulos, controladores y acciones del sistema ( en el ejemplo no era necesario que administrador heredará de alumno ya que le estamos dando todos los privilegios, solo lo hacemos heredar para que se vea que existe dicha posibilidad).
  
 
==== Definiendo los Templates ====
 
==== Definiendo los Templates ====
  
Ademas se puede definir una sección llamada '''[templates]''' en la que se establecen las plantillas a utilizar por cada rol (muy util cuando la vista cambia dependiendo del usuario), en el ejemplo al rol alumno se le ha asignado el template "alumno" y al rol administrador se le ha asignado el template "admin"
+
Ademas se puede definir una sección llamada '''[templates]''' en la que se establecen las plantillas a utilizar por cada rol (muy util cuando la vista cambia dependiendo del usuario), en el ejemplo al rol '''alumno''' se le ha asignado el template "alumno" y al rol '''administrador''' se le ha asignado el template "admin"
 +
 
 +
=== Usando la Librería ===
 +
 
 +
Usaremos el metodo '''initialize''' de la clase '''AppController''' para controlar los accesos en toda la aplicación, ya que todos los controladores heredan de dicha clase.
  
 
<source lang=php>
 
<source lang=php>
Línea 174: Línea 178:
  
 
     final protected function initialize() {
 
     final protected function initialize() {
        $this->validar_sesion();
+
        //instanciamos a la clase MyAcl , y le indicamos el ini a utlizar
    }
+
         $acl = new MyAcl('privilegios'); //si no se especifica el archivo a usar, por defecto busca en privilegios.ini
 
+
         $modulo = $this->module_name; //obtenermos el modulo actual
    protected function validar_sesion() {
+
         $controlador = $this->controller_name; //obtenemos el controlador actual
         $acl = new MyAcl();
+
         $accion = $this->action_name; //y obtenemos la accion actual
         $modulo = $this->module_name;
+
       
         $controlador = $this->controller_name;
+
        // en el ejemplo se obtiene el privilegio del usuario actual a traves de la libreria Auth
         $accion = $this->action_name;
+
        // pero se puede aplicar algun otro método para obtener el privilegio del usuario actual
 
         $privilegio = Auth::get('privilegio');
 
         $privilegio = Auth::get('privilegio');
         if (!$acl->check($privilegio, $modulo, $controlador, $accion)) {
+
         if (!$acl->check($privilegio, $modulo, $controlador, $accion)) { //verificamos si tiene ó no privilegios
 +
           
 +
            // si no posee los privilegios necesarios le enviamos un mensaje indicandoselo
 
             Flash::error("No posees suficientes PRIVILEGIOS para acceder a: {$modulo}/{$controlador}/{$accion}");
 
             Flash::error("No posees suficientes PRIVILEGIOS para acceder a: {$modulo}/{$controlador}/{$accion}");
             $this->tiene_permiso = false;
+
              
 +
            //no dejamos que entre al contenido de la url si no tiene permisos
 +
            View::select(NULL,'no_permiso');
 +
            return false;
 
         }
 
         }
 
     }
 
     }
Línea 192: Línea 201:
  
 
</source>
 
</source>
 +
 +
 +
Aquí un ejemplo de una denegación de acceso
 +
[[Archivo:Acl_1.PNG]]
 +
 +
 +
Esta es una manera sencilla de trabajar con lista de acceso, manteniendo la configuración de los roles a traves de un archivo .ini sin necesidad de realizar ningun tipo de programación en PHP :-)
  
  
Línea 197: Línea 213:
  
 
Realizado por: Manuel Aguirre (manuel_j555)
 
Realizado por: Manuel Aguirre (manuel_j555)
 +
 +
[[Categoría:Tutoriales KumbiaPHP]]
 +
[[Categoría:Tutoriales KumbiaPHP Beta2]]

Revisión actual del 00:12 17 dic 2011

{{#if: |}}

{{#if:

|}}



Descripción[editar]

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

Nos basaremos en el uso de la librería Acl2 de KumbiaPHP.

Librería para manejar las listas de control de acceso[editar]

Esta clase nos permitirá llevar un control de los distintos tipos de usuario a traves de un archivo .ini, la clase se llamará MyAcl y estará ubicada 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 ;
        }
    }

}

Descripción y uso de la librería MyAcl[editar]

La librería MyAcl se encarga de controlar los accesos de los usuarios en la aplicación, verificando si cada usuario tiene los permisos necesarios para acceder ó no a ciertos módulos de la misma, todo ellos segun los criterios establecidos en el archivo ini.

El Archivo .INI[editar]

La clase MyAcl necesita de un archivo .ini para crear el control de los accesos en la aplicación, aquí tenemos un ejemplo de un archivo ini básico, (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 = alumno ; 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 vistas
menu = index,consultas,reportes  ;puede entrar al controlador menu y ver las vistas index,consultas y reportes
admin/usuarios = index,agregar ; puede entrar al modulo admin , controlador usuarios acciones index y agregar solamente

[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


La estructura del archivo ini es muy sencilla, en primer lugar existe una sección llamada roles, en la cual se definen cada uno de los distintos tipos de usuarios que va a tener la aplicación.


Definiendo los Roles[editar]

En el ejemplo se han definido dos roles, uno llamado alumno y otro llamado administrador, el rol "alumno" tiene un valor "null" lo que significa que no hereda privilegios de ningun otro rol, mientras que el rol administrador tiene como valor "alumno" con lo cual estamos indicando que administrador va a heredad todos los privilegios de alumno (si un rol hereda de varios roles, simplemente deben escribirse cada uno separados por coma: mi_rol = rol_1,rol_2,ro_3 ).


Definiendo los Recursos[editar]

Las siguientes secciones variaran de acuerdo a los roles existentes en la aplicación, es decir, si existen tres roles, deberán haber tres secciones cada una con el nombre de un rol, en el ejemplo existen dos secciones para los roles, una sección llamada [alumno] y otra llamada [administrador], y en cada una de ellas se han definido los recursos a los cuales pueden acceder.

En el caso del rol [alumno] se han definidon definido tres recursos, index = * (significa que alumno puede acceder al controlador index, y el asterisco indica que puede acceder a todas las vistas de dicho controlador) , menu = * (puede entrar al controlador menu, siempre y cuando se acceda a alguna de las vistas indicadas [index,consultas,reportes]) , y por ultimo admin/usuarios ( puede entrar al modulo admin, controlador usuarios, acciones index y agregar ).

El rol [administrador] no tiene ningun recurso establecido en el archivo .ini, con lo cual estamos diciendo que administrador tiene privilegios para entrar a todos los modulos, controladores y acciones del sistema ( en el ejemplo no era necesario que administrador heredará de alumno ya que le estamos dando todos los privilegios, solo lo hacemos heredar para que se vea que existe dicha posibilidad).

Definiendo los Templates[editar]

Ademas se puede definir una sección llamada [templates] en la que se establecen las plantillas a utilizar por cada rol (muy util cuando la vista cambia dependiendo del usuario), en el ejemplo al rol alumno se le ha asignado el template "alumno" y al rol administrador se le ha asignado el template "admin"

Usando la Librería[editar]

Usaremos el metodo initialize de la clase AppController para controlar los accesos en toda la aplicación, ya que todos los controladores heredan de dicha clase.

<?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() {
         //instanciamos a la clase MyAcl , y le indicamos el ini a utlizar
         $acl = new MyAcl('privilegios');  //si no se especifica el archivo a usar, por defecto busca en privilegios.ini
         $modulo = $this->module_name; //obtenermos el modulo actual
         $controlador = $this->controller_name; //obtenemos el controlador actual
         $accion = $this->action_name; //y obtenemos la accion actual
         
         // en el ejemplo se obtiene el privilegio del usuario actual a traves de la libreria Auth
         // pero se puede aplicar algun otro método para obtener el privilegio del usuario actual
         $privilegio = Auth::get('privilegio');
         if (!$acl->check($privilegio, $modulo, $controlador, $accion)) { //verificamos si tiene ó no privilegios
             
             // si no posee los privilegios necesarios le enviamos un mensaje indicandoselo
             Flash::error("No posees suficientes PRIVILEGIOS para acceder a: {$modulo}/{$controlador}/{$accion}");
             
             //no dejamos que entre al contenido de la url si no tiene permisos
             View::select(NULL,'no_permiso');
             return false;
         }
    }

}


Aquí un ejemplo de una denegación de acceso Acl 1.PNG


Esta es una manera sencilla de trabajar con lista de acceso, manteniendo la configuración de los roles a traves de un archivo .ini sin necesidad de realizar ningun tipo de programación en PHP :-)



Realizado por: Manuel Aguirre (manuel_j555)