Herramientas de usuario

Herramientas del sitio


cursos:yii:roles

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