Commits

christiansalazar committed 7d33927

agregado el control de rbac aplicado globalmente al controller, CrugeAccessControlFilter alterado.

Comments (0)

Files changed (2)

 
 RBAC es el sistema de control de acceso basado en roles (por sus siglas en ingles).  Todo el mecanismo RBAC puede ser manejado mediante la interfaz (UI) de Cruge, o mediante su API. Las dos modalidades para usar en este mecanismo son:
 
-1. Consulta Explicita de Permisos.
+1. Consulta Manual de Permisos.
 Es basicamente el mismo mecanismo que provee Yii, pero en Cruge se ha ampliado un poco mas. Para usar este mecanismo: en cualquier parte de tu codigo fuente puedes poner lo siguiente:
 
-	<?php if(Yii::app()->user->checkAccess('puede_ver_menu_sistema')) { ...mostar menu sistema... }?>
+	<?php 
+		if(Yii::app()->user->checkAccess('puede_ver_menu_sistema')) { ...mostar menu sistema... }
+	?>
 
 2. Consulta Automatizada segun controller/action.
 Este mecanismo es muy util, porque permite controlar el acceso a tus controllers/actions de forma totalmente automatizada y controlada mediante la UI de Cruge.   Para usar este mecanismo, necesitar�s incluir en tu Controller (cualquiera que tu uses y que desees controlar a nivel de permisos) el siguiente codigo:
 		..cuerpo de tu controladora...
 	?>
 
-Este mecanismo de control causar� que el nombre del action sumado al nombre de la controladora sea reconocido por Cruge RBAC como una OPERACION, esta OPERACION podr� ser incluida en una TAREA o en un ROL.
+Al usar CrugeAccessControlFilter estas permitiendo que Cruge controle el acceso tanto al controller en general como al action especifico.
 
 Ejemplo:
 
-	empleadoController, tiene un action llamado actionNomina().  El nombre de la OPERACION ser� construido automaticamente de esta forma: 'opr_empleado_nomina'.
+	Un usuario cualquiera, incluso un invitado, intenta acceder a la siguiente URL: 
+		
+		index.php?r=empleado/vernomina.
 	
-	Luego, tu puedes agregar esa operacion a una TAREA o a un ROL para crear jerarquias de permiso.
+	pues bien, Cruge verificara dos cosas:
 	
-IMPORTANTE: Debes saber que no siempre cruge crear� estas operaciones, solo lo har� si esta configurado el parametro del modulo: 'rbacSetupEnabled'=>true,  (en la config del componente Cruge)
-
-
-###Usando el rbac mediante Cruge:
-
-	<?php Yii::app()->user->checkAccess('nombre_de_item'); ?>
-	
-Como ves, es una forma mas reducida a la forma oficial, porque Cruge estara encapsulando lo necesario para dejarte a ti solamente lo que necesitas explicitamente.
-
-###Usando el rbac directamente (via oficial):
-
-Cruge es una extension que permite usar el mecanismo oficial de Yii, mediante dos vias, ambas indenticas:
-
-	<?php Yii::app()->user->rbac->checkAccess(...argumentos oficiales...); ?>
+		a) el acceso a la controladora: 'Empleado'.
+		
+		b) el acceso al action 'Vernomina'.
+		
+	lo hara de esta forma:
 	
-	que es lo mismo a:
+		a) verifica si el usuario (aun invitado) tiene asignada la operacion: 'controller_empleado'
+		
+		b) verifica si el usuario (aun invitado) tiene asignada la operacion: 'opr_empleado_vernomina'
 	
-	<?php Yii::app()->authManager->checkAccess(...argumentos oficiales...); ?>
+	si ambas condiciones se cumplen (a y b) entonces tendr� acceso al action.
 	
-cual es la diferencia ? ninguna.  Solo se creo Yii::app()->user->rbac como una via mas "ordenada" para acceder a la funcion, ya que es relativa al usuario, mas que todo es para no ver dos componentes aislados.
-
-###Modo de Programacion RBAC - Visor de Permisos Requeridos
+Si tu quieres denegar el total acceso a un controller simplemente no le asignas al usuario la operacion que tenga el nombre del controller antecedido de la palabra 'controller_'. 
 
-Cruge dispone de una utilidad para ayudar a programar los permisos requeridos en un Rol con el objeto de que el usuario que tenga ese rol pueda realizar su trabajo con las restricciones adecuadas.
-
-Para ello el API de UI (Yii::app()->user->ui) dispone del siguiente mecanismo:
-
-1. Habilita el flag 'rbacSetupEnabled'=>true en tu config/main del componente cruge para obtener acceso a esta caracteristica.
+Si tu quieres denegar el acceso a un action de un controller simplemente no le asignas al usuario la operacion que tenga el nombre del action: 'opr_nombrecontroller_nombreaction'. 
 	
-2. Cuando habilitas el flag mencionado se iran creando las operaciones basadas en controller/action de forma automatica, para ello deberas incluir en cada controladora el siguiente filtro:
+###Modo de Programacion.	
 	
-		<?php
-		..cuerpo de tu controladora...
-		public function filters()
-		{
-			return array(
-				array('CrugeAccessControlFilter'),	
-			);
-		}	
-		..cuerpo de tu controladora...
-		?>
-	
-3.	Prueba tu aplicacion web con el usuario que tenga asignados los roles requeridos y que necesites probar.  Ocurriran dos cosas:
-		
-	a)	cuando tu pones explicitamente en alguna parte una sentencia de control y el usuario falla, es decir, no la tiene asignada en algun rol o tarea, entonces se almacenara como un error en una lista interna de Cruge. Esta lista podras verla mas adelante.
-		
-		<?php if(Yii::app()->user->checkAccess('solo_admins')) { ...haz algo... } ?>
-		
-			
-	b)	cuando una controladora incorpora el filtro 'CrugeAccessControlFilter' y un usuario no tiene asignada la operacion que representa a un action de esa controladora, entonces Cruge reportara el error. Recuerda que mas adelante escribi que Cruge maneja los actions y controllers automaticamente, si tu tienes un controller llamado "prueba" y dentro de el a un action llamado "Listado" entonces el programador de rbac creara automaticamente una operacion llamada "opr_prueba_listado", esta operacion la puedes agregar a un rol o una tarea.
+Habras notado que las operaciones deben existir explicitamente para que Cruge las use (sino dara acceso denegado a todo..), pues bien, si pones el flag rbacSetupEnabled en true (en la config) entonces Cruge ira creando las operaciones a medida que vayas usando los actions y sus controllers.
+
+Para conocer que operaciones se requieren para un usuario especifico debes poner en tu layout principal la siguiente linea:
+
+	<?php 
+		echo Yii::app()->user->ui->displayErrorConsole(); 
+	?>
 	
-4.	Como reportar los errores ?.  Puedes poner al pie de tu pagina web (en el layout principalmente) lo siguiente:
-		
-		<?php echo Yii::app()->user->ui->displayErrorConsole(); ?>
-				
-Ten en cuenta que este mecanismo solo funcionara si esta habilitado el flag 'rbacSetupEnabled'. De otro modo aunque llames a displayErrorConsole() este no mostrara nada.
+Es util porque te ira diciendo que operaciones no fueron halladas para el usuario activo, en modo de produccion si la operacion no esta asignada al usuario mediante un TASK o un ROLE entonces este recibira acceso denegado o simplemente tu setencia fallara en FALSE, es decir:  if(Yii::app()->user->checkAccess('operacion')) sera 'false'.	
+	

components/CrugeAccessControlFilter.php

 	
 		protected function preFilter($filterChain)
 		{
+			
+			$controllerItemName = "controller_".Yii::app()->getController()->id;
+			
 			$currentActionName = Yii::app()->getController()->action->id;
-			$itemName = "opr_".Yii::app()->getController()->id."_".$currentActionName;
+			$actionItemName = "opr_".Yii::app()->getController()->id."_".$currentActionName;
 			
-			if(Yii::app()->user->checkAccess($itemName))
+			// tiene permiso para la controladora indicada ?
+			//
+			// tiene permiso para la accion indicada ?
+			//
+			if(Yii::app()->user->checkAccess($controllerItemName))
 			{
-				// si tiene autorizacion
+				// si tiene permiso.
 				
+				// tiene permiso para la accion indicada ?
+				//
+				if(Yii::app()->user->checkAccess($actionItemName))
+				{
+					// si tiene autorizacion para la accion indicada
+					
+				}
+				else{
+					// no esta autorizado
+					//
+					if(CrugeUtil::config()->rbacSetupEnabled == false)
+						throw new CrugeException("acceso denegado",$actionItemName);
+				}
 			}
 			else{
-				// no esta autorizado
+				// no esta autorizado a la controladora en general.
 				//
 				if(CrugeUtil::config()->rbacSetupEnabled == false)
-					throw new CrugeException("acceso denegado",$itemName);
+					throw new CrugeException("acceso denegado",$controllerItemName);
 			}
 			
 			$filterChain->run();