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
}