====== Trabajar con roles ======
En la mayoría de las casos, para restringir qué usuarios pueden ejecutar una acción no es suficiento con distinguir si está autenticado o no, o si se llama "admin". Lo típico es utilizar los roles. A cada usuario le asignaremos uno o varios roles, y cada acción comprobará si un rol está permitido para ese usuario. Se puede hacer utilizando una extensión de Yii, o manualmente definiendo un atributo "roles" en la ficha del usuario que contiene los roles asociados al usuario (También hay una forma más versátil, asignando al usuario un rol, y mediante una tabla de roles-acciones definir qué acciones están permitidas a cada rol). Vamos a ver aquí la forma sencilla.
1. En el método login() de LoginForm nos guardaremos el dato roles del usuario:
Yii::app()->user->setState('roles',$this->_identity->datos->roles);
2. En protected/components creamos WebUser.php que contiene una clase derivada de CWebUser, para hacer las validaciones de roles de una forma más elegante, además de poder incluir otros métodos asociados a la sesión que sean interesantes para nuestra aplicación:
class WebUser extends CWebUser {
public function hasrole($role){
if($this->isGuest)
return false;
else
return (strpos($this->roles,$role)!==false);
}
}
3. En protected/config/main.php, configuramos el módulo 'user' para que el objeto usuario de la sesión sea nuestra nueva clase:
'components'=>array(
'user'=>array(
'class'=>'WebUser',
'allowAutoLogin'=>true,
),
4. Ahora, en cada acción, o en cualquier vista o controlador podemos comprobar si el usuario actual tiene un rol determinado:
public function accessRules() {
return array(
array('allow',
'actions' => array('admin', 'comprobar'),
'expression' => 'Yii::app()->user->hasrole("AD")',
),
}
if(Yii::app()->user->hasrole('AD')) {
//Muestra el botón de borrar
...
}