[RESUELTO] Roles y más roles

Vamos a ver, estoy desesperado.

He probado todo lo referente al tema, y no he conseguido hacerlo funcionar.

Paso a paso para torpes (osea, para mi):

Primer paso: Configuramos el main.php de CONFIG.




'db'=>array(

  'connectionString' => 'mysql:host=localhost;dbname=portal',

  'emulatePrepare' => true,

  'username' => 'root',

  'password' => '',

),

		

'authManager'=>array(

  'class'=>'CDbAuthManager',

  'connectionID'=>'db',

),



Segundo paso: Creamos las tres tablas en MySQL.




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

);



Tercer paso: Introducimos datos en las tablas para hacer pruebas.




Tenemos un usuario con el Id=3


En la tabla de items (authitem) introducimos:

name=admin

type=2 --------------> Este número corresponde a ROL

description=null

bizrule=null

data=null

-----------------

name=adminUser

type=0 --------------> Operacion

descripction=null

bizrule=null

data=null


En la tabla asignamiento (authassignment) introducimos:

itemname=admin

userid=3

bizrule=null

data=null


En la tabla de padres-hijos (authitemchild) introducimos:

parent=admin

child=adminUser



Cuarto paso: Chequeamos en un controlador




public function actionView($id)

{

  if (Yii::app()->user->checkAccess('admin')) {

    $this->render('view',array(

    'model'=>$this->loadModel($id),

    ));

  } else {

    $this->render('view2');

  }

}



Es decir, que si el usuario que esta lanzando la accion es el "3" tendria que mostrar "view" y para cualquier otro usuario mostraría "view2".

PUES NOOOOOO.

Siempre muestra "view2".

¿Por qué?

Alguien que me aclare esto.

Muchas gracias.

En el UserIdentity estas modificando el ID guardado para que séa un número y no el nombre de usuario, me imagino, no?

El checkname usa el id del CWebUser.

Cualquier cosa avisame.

mmm…

No se trata de revisar el acceso a una operacion cuando se utiliza checkAccess?

http://www.yiiframework.com/doc/api/1.1/CWebUser#checkAccess-detail

Te expongo el ejemplo que hay en la guia:




auth=Yii::app()->authManager;


// creando operaciones 

$auth->createOperation('createPost','create a post');

$auth->createOperation('readPost','read a post');

$auth->createOperation('updatePost','update a post');

$auth->createOperation('deletePost','delete a post');


// creando la regla -- observa como chequea el id del usuario

$bizRule='return Yii::app()->user->id==$params["post"]->authID;';

$task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule);

$task->addChild('updatePost');


// creando los roles, asignando operaciones

$role=$auth->createRole('reader');

$role->addChild('readPost');

 

$role=$auth->createRole('author');

$role->addChild('reader');

$role->addChild('createPost');

$role->addChild('updateOwnPost');

 

$role=$auth->createRole('editor');

$role->addChild('reader');

$role->addChild('updatePost');

 

$role=$auth->createRole('admin');

$role->addChild('editor');

$role->addChild('author');

$role->addChild('deletePost');


// finalmente asignando los roles a los usuarios

$auth->assign('reader','readerA'); // readerA es el nombre de un usuario

$auth->assign('author','authorB');

$auth->assign('editor','editorC');

$auth->assign('admin','adminD');



Ahora imaginemos que el usuario que ha entrado quiere crear un post




if(Yii::app()->user->checkAccess('createPost'))

{

    // crear el post

}else // o no..



Porqué no pruebas de meter los datos del ejemplo expuesto en la quía y miras la base de datos cómo se vinculan las tablas unas a otras? Cuando lo hayas comprendido, entonces podrás hacer como quieras… Es lo que hago yo en la mayoría de los casos.

Un saludo

Bueno, ya esta resuelto.

Ante todo gracias a los dos por responder.

La respuesta es que al crear la asignación, en todos los sitios se habla de almacenar el item y el identificador de usuario, lo que en ningun sitio se especifica es que el identificador de usuario no es su ID, sino su NOMBRE. Es decir, en el ejemplo que he puesto arriba habría que cambiar:




En la tabla asignamiento (authassignment) introducimos:

itemname=admin

userid=3 --> userid=pepe

bizrule=null

data=null



Lo dicho, gracias a los dos.

Enhorabuena, de todas formas mirate esto Juan…

http://www.yiiframework.com/forum/index.php?/topic/10556-extension-rights/

saludos!

Gracias de nuevo Antonio.

No necesito un control avanzado de roles. Por lo menos de momento.

Gracias y saludos.

Hola, estuve siguiendo este post y hay algo que no me cuadra.

Al momento de asignar un rol a un usaurio como en el siguiente ejemplo:

$auth->assign(‘admin’,‘adminD’);

Tengo entendido que adminD representa el nombre de usuario, pero en mi aplicación he hecho las distintas asignaciones y no me permite acceder aunque esté logueado con el usuario adminD.

En el controlador tengo la siguiente regla de acceso:

return array(

        array('allow',


            'actions'=>array('create','update','admin','delete'),


             'roles'=>array('admin'),





        ),


          array('allow',


            'actions'=>array('index','view'),


            'roles'=>array('profesor'),


        ),


        array('deny',


            'users'=>array('*'),


        ),

);

He leido que en este caso adminD es el nombre con el que el usuario ingresa al sistema, no estoy seguro si este nombre se refiere al username asignado o algun valor asignado en UserIdentity.

De antemano, gracias por su ayuda.