Autorización. Control de acceso basado en Roles.

Buenos dias.

Ya tengo hecha la autenticación contra la base de datos y funciona perfecto.

La tengo hecha con 3 campos (CIF EMPRESA, NIF OPERADOR, CONTRASEÑA).

CIF y NIF los guardo en la sesión con setState.

NIF OPERADOR es el original username: Yii::app()->user->getState(‘username’)

Ahora estoy con el tema de la autorización por roles. No me los reconoce. Lo que tengo hecho es lo siguiente:

  • Ya tengo en mi base de datos las 3 tablas AuthItem, AuthItemChild y AuthAssignment, con sus registros correspondientes (insertados desde phpmyadmin o script sql ejecutado desde consola). Por supuesto empleé la estructura de tablas según el framework Yii.

  • También tengo activado RBAC en protected/config/main.php




// uncomment the following to use a MySQL database

'db'=>array(

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

	'emulatePrepare' => true,

	'username' => 'miusername',

	'password' => 'mipassword',

	'charset' => 'utf8',

),

// AÑADO ESTO PARA ACTIVAR CONTROL ACCESO BASADO EN ROLES...

'authManager'=>array(

	'class'=>'CDbAuthManager', // ...almacenados en BD (CDbAuthManager)

	'connectionID'=>'db',

	),



  • Y en UsuariosController.php tengo de momento, para ver si funciona, lo siguiente:



public function accessRules()

{

	return array(

                array('allow', 

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

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

		),

                array('deny',  // deny all users

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

		),

	);

}




Cuando me autentico con CIF EMPRESA, NIF OPERADOR, CONTRASEÑA entro perfecto pero la autorización falla pues me deniega el acceso. ¿Por qué no reconoce rol ‘superadmin’? y eso que estoy en la tabla ‘AuthAssignment’. Tanto en la empresa 1 (A1111111A), como en la empresa 2 (B2222222B), y con mi NIF a continuación.

Te muestro el resto de registros en las tablas Auth:

Registros en AuthAssignment:




itemname 	userid 			bizrule 	data


superadmin 	A1111111A25252525L 	NULL 		NULL

superadmin 	B2222222B25252525L 	NULL 		NULL

admin 		A1111111A11111111L 	NULL 		NULL

admin 		B2222222B44444444L 	NULL 		NULL

lector 		A1111111A33333333L 	NULL 		NULL

lector 		B2222222B66666666L 	NULL 		NULL

operador 	A1111111A22222222L 	NULL 		NULL

operador 	B2222222B55555555L 	NULL 		NULL



Como puedes ver, asigno el rol ‘superadmin’ a dos usuarios entre otros (pero eso entiendo que se puede hacer)

El campo ‘userid’ se compone de la concatenación de ‘CIF EMPRESA + NIF USUARIO’ y lo tengo guardado en la sesión, cuando el usuario se autentifica con CIF EMPRESA, NIF USUARIO y CONTRASEÑA.

El campo userid, corríjeme si me equivoco, es el nombre que el usuario ha utilizado para acceder a la aplicación. Lo que no se hacer es que la AUTORIZACIÓN DE YII entienda que userid es concatenación de lo que he guardado en la sesión. Agradecería sugerencias.

Aunque para hacer pruebas he modificado el userid de la tabla AuthAssignment, quedando asi…




itemname 	userid 			bizrule 	data


superadmin 	25252525L 	 	NULL 		NULL

superadmin 	25252525L 	 	NULL 		NULL

admin 		A1111111A11111111L 	NULL 		NULL

admin 		B2222222B44444444L 	NULL 		NULL

lector 		A1111111A33333333L 	NULL 		NULL

lector 		B2222222B66666666L 	NULL 		NULL

operador 	A1111111A22222222L 	NULL 		NULL

operador 	B2222222B55555555L 	NULL 		NULL



…pero tampoco funciona.

REGISTROS EN RESTO DE TABLAS Auth:

Registros en AuthItem:




name 	 	type 	description 	bizrule 	data


superadmin 	2 	NULL 	 	NULL 	 	NULL

admin 	 	2 	NULL 	 	NULL 	 	NULL

operador 	2 	NULL 	 	NULL 	 	NULL

lector 	 	2 	NULL 	 	NULL 	 	NULL

create 	 	0 	NULL 	 	NULL 	 	NULL

read 	 	0 	NULL 	 	NULL 	 	NULL

update 	 	0 	NULL 	 	NULL 	 	NULL

delete 	 	0 	NULL 	 	NULL 	 	NULL



Registros en AuthItemChild:




parent 	 	child


superadmin 	admin

admin 	 	operador

operador 	lector



No se que es lo que estoy haciendo mal.

Agradecería ayuda.

Muchas gracias.

SOLUCIONADO.

Tenia un error de concepto en la tabla AuthAssignment.

El campo ‘userid’ de la tabla AuthAssignment es el id del usuario que se autentica en login.

Es Yii::app()->user->id

Es el id del usuario de tabla usuarios.

La tabla AuthAssignment quedaría asi:




itemname        userid       bizrule         data


superadmin      5            NULL            NULL

superadmin      3            NULL            NULL

admin           6            NULL            NULL

admin           8            NULL            NULL

lector          2            NULL            NULL

lector          10           NULL            NULL

operador        11           NULL            NULL

operador        24           NULL            NULL



Ya he puesto un comentario en ‘Introducción al control de acceso basado en roles (RBAC)’

Gracias de todos modos

Espero sirva esto para alguien.

Saludos.