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 © 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
}
Una pregunta, en que controlador debo crear los metodos?
ResponderEliminarSoy nueva programando y aun mas en Yii.
Saludos y gracias por la info.
Hola.
ResponderEliminarEn un principio los métodos les puedes crear en el controlador que tengas por defecto, (normalmente DefaultController).
Un saludo.
Buenos Dias
ResponderEliminarCarlos 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
Hola Luis.
ResponderEliminarPrimero 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.
Hola Carlos
ResponderEliminarmuchas gracias por la aclaracion
pero estoy un poco confundido, si me puedes proporcionar el ejemplo que me informas te lo agradeceria demasiado
saludos
Amigo publica los archivos del ejercicio, es muy importante
ResponderEliminarAfirmo 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.
ResponderEliminarPodrías facilitarnos los archivos?
Gracias!