domingo, 31 de julio de 2011

Como configurar RBAC con Yii Framework

En este articulo voy a resumir de manera concisa, los pasos a seguir para configurar RBAC (Role Base Access Control) en nuestra aplicación. Gracias a este sistema, podremos integrar en nuestra aplicación un control de acceso basado en los roles que tengan los usuarios de la aplicación.

Así en las clases controladoras solo tendremos que especificar que rol, tiene permisos para ejecutar una acción y solamente ejecutarán esa acción aquellos usuarios que tengan el rol especificado.

Pasos a seguir

En este punto asumiremos que tenéis el entorno de desarrollo montado y una aplicación Yii Framework generada (puede ser mediante la herramienta yiic ). También que la aplicación está configurada para acceder a una base de datos MySql.

En esta definición de pasos, nos vamos a centrar solo en roles. Si leeis la  Guia RBAC de Yii Framework, veréis que Yii nos permite una granularidad más fina que simples roles. Nos permite definir tareas, con un conjunto de operaciones a realizar, para completar una tarea.

Nosotros, solo vamos a configurar tres roles: administrador, usuario normal, invitado.

Paso1: Configurar la aplicacion para activar RBAC sobre una base de datos

El primer paso será activar RBAC. Para ello modificamos el archivo main.php que se encuentra en el directorio protected/config del proyecto.

'authManager'=>array(
        'class'=>'CDbAuthManager',
        'connectionID'=>'db',
    ),

Esto nos permitira decir a Yii que utilice como manager de autorización la clase CDbAuthManager. Este manager es un autorizador que guarda la información de autorización en base de datos. En nuestro caso en la base de datos MySql de la aplicación.

Paso 2: Creación de las tablas RBAC

El siguiente paso es crear la tablas en la base de datos. Para ello ejecutamos el scrip schema.sql que se encuentra en el directorio web/auth del directorio donde tengamos el framework Yii. El scrip es el siguiente:

/**
 * Database schema required by CDbAuthManager.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link http://www.yiiframework.com/
 * @copyright Copyright &copy; 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 * @since 1.0
 */
 
drop table if exists AuthAssignment;
drop table if exists AuthItemChild;
drop table if exists AuthItem;
 
create table AuthItem
(
   name                 varchar(64) not null,
   type                 integer not null,
   description          text,
   bizrule              text,
   data                 text,
   primary key (name)
);
 
create table AuthItemChild
(
   parent               varchar(64) not null,
   child                varchar(64) not null,
   primary key (parent,child),
   foreign key (parent) references AuthItem (name) on delete cascade on update cascade,
   foreign key (child) references AuthItem (name) on delete cascade on update cascade
);
 
create table AuthAssignment
(
   itemname             varchar(64) not null,
   userid               varchar(64) not null,
   bizrule              text,
   data                 text,
   primary key (itemname,userid),
   foreign key (itemname) references AuthItem (name) on delete cascade on update cascade
);

Los nombres de las tablas RBAC, se pueden cambiar, teniendo en cuenta que también habrá que cambiar los nombres a la hora de crear el manager de autenticación. Para ello deberemos añadir tres parámetros más, indicando los nombres de las tres tablas así:

'authManager'=>array(
        'class'=>'CDbAuthManager',
        'connectionID'=>'db',
        'itemTable'=>'AuthItem', // Tabla que contiene los elementos de autorizacion
        'itemChildTable'=>'AuthItemChild', // Tabla que contiene los elementos padre-hijo
        'assignmentTable'=>'AuthAssignment', // Tabla que contiene la signacion usuario-autorizacion
    
),

No es objeto de este artículo, comentar el proceso de autorización del RBAC de Yii. Para saber más acerca del significado de las tablas podéis condultar la Guia RBAC de Yii Framework (en inglés).

Paso 3: Poblar las tablas con los roles que necesitemos.

Para ello definimos un método en el controlador que nos permita, dar de alta los roles a través del AuthManager. Usamos CAuthManager::createRole() para crear cada uno de los roles. Esta función nos permite especificar un script de código PHP que se ejecutará cuando el sistema compruebe el rol.

function actionCrearRoles()
{
$auth=Yii::app()->authManager;
  $bizRule='return !Yii::app()->user->isGuest;';
  $auth->createRole('authenticated', 'authenticated user', $bizRule);
 
  $bizRule='return Yii::app()->user->isGuest;';
  $auth->createRole('guest', 'guest user', $bizRule);
}

En el ejemplo hemos creado dos roles: el rol de usuario autenticado, y el rol de invitado.

Paso 4 : Comprobación de roles

Para comprobar los roles de usuario simplemente tenemos que llamar al método checkAccess en los lugares de la aplicación donde queramos comprobar permisos, de la siguiente manera:

if(Yii::app()->user->checkAccess('guest'))
{
    // codigo para el usuario invitado
}

7 comentarios:

  1. Una pregunta, en que controlador debo crear los metodos?
    Soy nueva programando y aun mas en Yii.

    Saludos y gracias por la info.

    ResponderEliminar
  2. Hola.

    En un principio los métodos les puedes crear en el controlador que tengas por defecto, (normalmente DefaultController).

    Un saludo.

    ResponderEliminar
  3. Buenos Dias

    Carlos me prodrias colaborar informandome como crearia los roles ya que yo tengo una tabla de usuarios
    con los siguientes datos
    usuario
    contraseña
    nombre
    dependencia
    perfil // aca escribiria el nombre del rol
    telefono
    ya tengo funcionando el inicio de sesion de cada usuario que creo en la tabla

    serian 3 roles
    administrador
    interventor
    projectmanager

    si entiendo como llamar el método checkAccess

    No entiendo como integrar los perfiles que tengo en mi tabla con el RBAC

    Saludos

    ResponderEliminar
  4. Hola Luis.
    Primero tienes que crear las tres tablas de roles: AuthItem, AuthItemChild y AuthAssignment.

    Los roles: les das de alta en la tabla 'authitem'. En tu caso tendrás tres registros: administrador, interventor y projectmanager.

    Para integrar el perfil, RBAC usa la tabla AuthAssignment para establecer la relación usuario-rol, así que el campo 'perfil' de tu tabla de usuario sobra, el nombre del perfil va en la tabla AuthAssignment y se asocia el 'userid' (identificador del usuario) al perfil.

    Esta asociación lo puedes hacer dando de alta el rol directamente en la tabla o mediante la funcion createRole() del objeto Yii::app()->authManager.

    Espero que te sirva de ayuda, si necesitas más aclaraciones, no dudes en contactar conmigo, te puedo proporcionar un ejemplo.

    Un saludo.

    ResponderEliminar
  5. Hola Carlos
    muchas gracias por la aclaracion
    pero estoy un poco confundido, si me puedes proporcionar el ejemplo que me informas te lo agradeceria demasiado

    saludos

    ResponderEliminar
  6. Amigo publica los archivos del ejercicio, es muy importante

    ResponderEliminar
  7. Afirmo la importancia del último comentario, los archivos son importantes para entender lo que planteas como "un escenario" de la forma que podemos trabajar con este complemento.

    Podrías facilitarnos los archivos?

    Gracias!

    ResponderEliminar