====== 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 ... }