Diferencia entre revisiones de «Ejemplo de ACL con Spirit Beta2»

De KumbiaPHP Framework Wiki
Línea 5: Línea 5:
  
  
Lo primero que haremos será crear una tabla para los usuarios que tenga un campo rol con los roles que necesitamos en nuestra aplicación, en este ejemplo solo utilizaremos los roles de los visitantes y de los usuarios autenticados, el rol de administradores no lo utilizaremos para simplificar el ejemplo. La estructura de la tabla será mas o menos asi:
+
Lo primero es crear una tabla para los usuarios que tenga un campo rol con los roles necesarios en la aplicación, en este ejemplo solo se utilizaran los roles de visitantes y usuarios autenticados, el rol de administradores se usara para simplificar el ejemplo.  
 +
 
 +
La estructura base de la tabla será:
  
 
<source lang="sql" line>
 
<source lang="sql" line>
Línea 17: Línea 19:
 
</source>
 
</source>
  
La autenticación de los usuarios será tratada en otro ejemplo, por eso no explicamos ese tema aquí.
+
(La autenticación de los usuarios será tratada en otro ejemplo, por eso no explicamos ese tema aquí)
  
Luego modificamos el archivo application_controller.php para que quede de la siguiente forma:
+
 
 +
Se procede a modificar el archivo application_controller.php de la siguiente forma:
  
 
<source lang="php" line>
 
<source lang="php" line>
 
class ApplicationController extends Controller {
 
class ApplicationController extends Controller {
public $acl;
+
public $userRol = "";
+
public $acl; //variable objeto ACL
 +
public $userRol = ""; //variable con el rol del usuario autenticado en la aplicación
 
 
 
final protected function initialize(){
 
final protected function initialize(){
Línea 30: Línea 34:
 
 
 
$this->acl = new Acl();
 
$this->acl = new Acl();
// Agregando los roles
+
//Se agregan los roles
 
$this->acl->add_role(new AclRole("")); // Visitantes
 
$this->acl->add_role(new AclRole("")); // Visitantes
 
$this->acl->add_role(new AclRole("A")); // Administradores
 
$this->acl->add_role(new AclRole("A")); // Administradores
 
$this->acl->add_role(new AclRole("U")); // Usuarios
 
$this->acl->add_role(new AclRole("U")); // Usuarios
 
 
// Agregando los recursos
+
//Se agregan los recursos
 
$this->acl->add_resource(new AclResource("index"), "index");
 
$this->acl->add_resource(new AclResource("index"), "index");
 
$this->acl->add_resource(new AclResource("test"), "index");
 
$this->acl->add_resource(new AclResource("test"), "index");
 
 
// Permitiendo el acceso
+
//Se crean los permisos
// Inicio
+
// Inicio
 
$this->acl->allow("", "index", array("index"));
 
$this->acl->allow("", "index", array("index"));
 
$this->acl->allow("U", "index", array("index"));
 
$this->acl->allow("U", "index", array("index"));
// Test
+
// Test
 
$this->acl->allow("U", "test", array("index"));
 
$this->acl->allow("U", "test", array("index"));
 
}
 
}
Línea 53: Línea 57:
 
</source>
 
</source>
  
En la linea 2 creamos la variable que tendrá el objeto ACL, y en la 3 creamos una variable que tendrá el rol del usuario autenticado en la aplicación.
 
  
 
Luego en el método initialize verificamos si el usuario está autenticado y le asignamos el rol a la variable, luego creamos el objeto ACL y procedemos a agregarlos roles que manejamos en nuestra aplicación, para este ejemplo solo tenemos 2 un string vacío indica que es un visitante que no se ha autenticado y la letra U indica que es un Usuario ya autenticado. Luego agregamos los recursos al objeto ACL indicándole cuales son las acciones disponibles para esos recursos, en este ejemplo los recursos son los mismos controladores y las respectivas acciones de dichos controladores.
 
Luego en el método initialize verificamos si el usuario está autenticado y le asignamos el rol a la variable, luego creamos el objeto ACL y procedemos a agregarlos roles que manejamos en nuestra aplicación, para este ejemplo solo tenemos 2 un string vacío indica que es un visitante que no se ha autenticado y la letra U indica que es un Usuario ya autenticado. Luego agregamos los recursos al objeto ACL indicándole cuales son las acciones disponibles para esos recursos, en este ejemplo los recursos son los mismos controladores y las respectivas acciones de dichos controladores.

Revisión del 03:04 3 jun 2010

{{#if:Information icon4.png |}}

{{#if:

|}}



Lo primero es crear una tabla para los usuarios que tenga un campo rol con los roles necesarios en la aplicación, en este ejemplo solo se utilizaran los roles de visitantes y usuarios autenticados, el rol de administradores se usara para simplificar el ejemplo.

La estructura base de la tabla será:

CREATE TABLE `usuarios` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `clave` varchar(50) NOT NULL,
  `nombre` varchar(20) NOT NULL,
  `rol` enum('A','U') NOT NULL,
  PRIMARY KEY (`id`)
) ;

(La autenticación de los usuarios será tratada en otro ejemplo, por eso no explicamos ese tema aquí)


Se procede a modificar el archivo application_controller.php de la siguiente forma:

class ApplicationController extends Controller {
	
	public $acl; //variable objeto ACL
	public $userRol = ""; //variable con el rol del usuario autenticado en la aplicación
	
	final protected function initialize(){
		if(Auth::is_valid()) $this->userRol = Auth::get("rol");
		
		$this->acl = new Acl();
		//Se agregan los roles
		$this->acl->add_role(new AclRole("")); // Visitantes
		$this->acl->add_role(new AclRole("A")); // Administradores
		$this->acl->add_role(new AclRole("U")); // Usuarios
		
		//Se agregan los recursos
		$this->acl->add_resource(new AclResource("index"), "index");
		$this->acl->add_resource(new AclResource("test"), "index");
		
		//Se crean los permisos
		 // Inicio
		$this->acl->allow("", "index", array("index"));
		$this->acl->allow("U", "index", array("index"));
		 // Test
		$this->acl->allow("U", "test", array("index"));
	}

	final protected function finalize()
	{
	}
}


Luego en el método initialize verificamos si el usuario está autenticado y le asignamos el rol a la variable, luego creamos el objeto ACL y procedemos a agregarlos roles que manejamos en nuestra aplicación, para este ejemplo solo tenemos 2 un string vacío indica que es un visitante que no se ha autenticado y la letra U indica que es un Usuario ya autenticado. Luego agregamos los recursos al objeto ACL indicándole cuales son las acciones disponibles para esos recursos, en este ejemplo los recursos son los mismos controladores y las respectivas acciones de dichos controladores.

Ahora explicaremos que hace cada linea siguiente

$this->acl->allow("", "index", array("index"));

Esta linea le otorga permisos a los visitantes en la acción index del controlador index

$this->acl->allow("U", "index", array("index"));

Esta linea le otorga permisos a los usuarios autenticados en la acción index del controlador index

$this->acl->allow("U", "test", array("index"));

Esta linea le otorga permisos a los usuarios autenticados en la acción index del controlador test, esta es quizás la linea mas importante para este ejemplo, debido a que solo se le otorgan permisos a los usuarios autenticados para el controlador test, es decir que si intentamos entrar a la acción index del controlador test sin autenticarnos nos va a prohibir la entrada y eso es justamente lo que nos permite hacer los ACL


Ahora crearemos el controlador test_controller.php para probar este ejemplo y será de la siguiente forma:

class TestController extends ApplicationController{
	public function index(){
		Flash::info("Estamos en la acción {$this->action_name}");
	}
	
	public function before_filter(){
		// Verificando si el rol del usuario actual tiene permisos para la acción a ejecutar
		if(!$this->acl->is_allowed($this->userRol, $this->controller_name, $this->action_name)){
			Flash::error("Acceso negado");
			return false;
		}
	}
}

Como pueden observar el controlador test tiene el before_filter que nos va a permitir validar si el usuario tiene acceso a la acción en el controlador.

if(!$this->acl->is_allowed($this->userRol, $this->controller_name, $this->action_name))

Esta linea hace lo siguiente, verifica si para el rol ($this->userRol) esta permitido el acceso en el controlador actual ($this->controller_name) y la acción actual que quiere ver el usuario ($this->action_name), si no tiene permisos muestra un mensaje de error con Flash::error y hace un return para que no cargue la vista de la acción requerida.


Nota: Para hacer este ejemplo compatible con Spirit Beta1 deben editar el archivo acl.php que se encuentra en core/libs/acl/acl.php y en la linea 431 encontraran esto:

/*foreach($this->access[$role] as ){

}*/

Debajo de esas lineas pueden colocar las dos lineas siguientes

	if(!isset($this->access[$role][$resource][$access_list])) return false;
	if($this->access[$role][$resource][$access_list] == "A") return true;

Y quedaría de la siguiente forma

	/*foreach($this->access[$role] as ){

	}*/
	if(!isset($this->access[$role][$resource][$access_list])) return false;
	if($this->access[$role][$resource][$access_list] == "A") return true;

Estas lineas validan que el rol tenga acceso al resource en el ACL.