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

De KumbiaPHP Framework Wiki
 
(No se muestran 7 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
 
{{cleanupbox
 
{{cleanupbox
 
|image=[[Archivo:Information_icon4.png|45px]]
 
|image=[[Archivo:Information_icon4.png|45px]]
|texto ='''Este Artículo cumple con todos los quererimientos de los Kumbieros.'''<br />
+
|texto ='''Este Artículo cumple con todos los requerimientos de los Kumbieros.'''<br />
 
}}
 
}}
  
Línea 26: Línea 26:
  
  
Se procede a modificar el archivo application_controller.php de la siguiente forma:
+
Se procede a modificar el archivo app_controller.php de la siguiente forma:
  
 
<source lang="php" line>
 
<source lang="php" line>
class ApplicationController extends Controller {
+
class AppController extends Controller {
 
 
 
public $acl; //variable objeto ACL
 
public $acl; //variable objeto ACL
Línea 62: Línea 62:
  
 
El método initialize verifica si el usuario está autenticado y le asigna el rol a la variable, posteriormente crea el objeto ACL y procede a agregar los roles que maneja la aplicación; Para este ejemplo solo existen 2 roles, 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 se agregan los recursos al objeto ACL indicándole cuales son las acciones disponibles para dichos recursos, en este ejemplo los recursos son los mismos controladores y las respectivas acciones de los controladores.
 
El método initialize verifica si el usuario está autenticado y le asigna el rol a la variable, posteriormente crea el objeto ACL y procede a agregar los roles que maneja la aplicación; Para este ejemplo solo existen 2 roles, 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 se agregan los recursos al objeto ACL indicándole cuales son las acciones disponibles para dichos recursos, en este ejemplo los recursos son los mismos controladores y las respectivas acciones de los controladores.
 
 
 
  
 
== Comprobación de Permisos ==
 
== Comprobación de Permisos ==
  
 +
La linea siguiente 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 ACL
  
 
<source lang="php" line>
 
<source lang="php" line>
$this->acl->allow("", "index", array("index")); //Le otorga permisos a los visitantes en la acción index del controlador index
+
$this->acl->allow("U", "test", array("index"));  
 
</source>
 
</source>
  
 
<source lang="php" line>
 
<source lang="php" line>
 +
$this->acl->allow("", "index", array("index")); //Le otorga permisos a los visitantes en la acción index del controlador index
 +
 
$this->acl->allow("U", "index", array("index")); //Le otorga permisos a los usuarios autenticados en la acción index del controlador index
 
$this->acl->allow("U", "index", array("index")); //Le otorga permisos a los usuarios autenticados en la acción index del controlador index
 
</source>
 
</source>
  
  
<source lang="php" line>
 
$this->acl->allow("U", "test", array("index"));
 
</source>
 
 
La linea anterior 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
 
  
  
Línea 92: Línea 87:
  
 
<source lang="php" line>
 
<source lang="php" line>
class TestController extends ApplicationController{
+
class TestController extends AppController{
 
public function index(){
 
public function index(){
 
Flash::info("Estamos en la acción {$this->action_name}");
 
Flash::info("Estamos en la acción {$this->action_name}");
 
}
 
}
 
 
public function before_filter(){
+
protected function before_filter(){
 
// Verificando si el rol del usuario actual tiene permisos para la acción a ejecutar
 
// 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)){
 
if(!$this->acl->is_allowed($this->userRol, $this->controller_name, $this->action_name)){
Línea 114: Línea 109:
  
 
Esta linea verifica si el rol ($this->userRol) se tiene permitido el acceso en el controlador actual ($this->controller_name) y la acción actual que quiere ver el usuario ($this->action_name), si el usuario no tiene el permiso pertinente muestra un mensaje de error con Flash::error y se hace un return para que no cargue la vista de la acción requerida.
 
Esta linea verifica si el rol ($this->userRol) se tiene permitido el acceso en el controlador actual ($this->controller_name) y la acción actual que quiere ver el usuario ($this->action_name), si el usuario no tiene el permiso pertinente muestra un mensaje de error con Flash::error y se hace un return para que no cargue la vista de la acción requerida.
 
  
 
== Usando ACL en la Beta1 spirit ==
 
== Usando ACL en la Beta1 spirit ==
Línea 146: Línea 140:
  
 
Estas lineas validan que el rol tenga acceso al resource en el ACL.
 
Estas lineas validan que el rol tenga acceso al resource en el ACL.
 +
 +
 +
'''Importante:'''
 +
Si recibes el error: '''Catchable fatal error: Argument 1 passed to Acl::add_resource() must be an instance of Acl_Resource, instance of AclResource given''' deben editar el mismo archivo acl.php en la linea 210 encontraran:
 +
 +
<source lang="php" line>
 +
public function add_resource(Acl_Resource $resource) {
 +
</source>
 +
 +
Sustituimos con la siguiente linea (el nombre de la clase):
 +
 +
<source lang="php" line>
 +
public function add_resource(AclResource $resource) {
 +
</source>
  
 
[[Categoría:Tutoriales KumbiaPHP]]
 
[[Categoría:Tutoriales KumbiaPHP]]

Revisión actual del 10:18 16 feb 2012

{{#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 autenticación de los usuarios será tratada en otro ejemplo, por eso no explicamos ese tema aquí).


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`)
) ;


Creación de permisos[editar]

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

class AppController 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()
	{
	}
}

El método initialize verifica si el usuario está autenticado y le asigna el rol a la variable, posteriormente crea el objeto ACL y procede a agregar los roles que maneja la aplicación; Para este ejemplo solo existen 2 roles, 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 se agregan los recursos al objeto ACL indicándole cuales son las acciones disponibles para dichos recursos, en este ejemplo los recursos son los mismos controladores y las respectivas acciones de los controladores.

Comprobación de Permisos[editar]

La linea siguiente 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 ACL

$this->acl->allow("U", "test", array("index"));
$this->acl->allow("", "index", array("index")); //Le otorga permisos a los visitantes en la acción index del controlador index

$this->acl->allow("U", "index", array("index")); //Le otorga permisos a los usuarios autenticados en la acción index del controlador index



Controllers[editar]

Se crea el controlador test_controller.php para probar el ejemplo:

class TestController extends AppController{
	public function index(){
		Flash::info("Estamos en la acción {$this->action_name}");
	}
	
	protected 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 se puede observar el controlador test tiene el before_filter que 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 verifica si el rol ($this->userRol) se tiene permitido el acceso en el controlador actual ($this->controller_name) y la acción actual que quiere ver el usuario ($this->action_name), si el usuario no tiene el permiso pertinente muestra un mensaje de error con Flash::error y se hace un return para que no cargue la vista de la acción requerida.

Usando ACL en la Beta1 spirit[editar]

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.


Importante: Si recibes el error: Catchable fatal error: Argument 1 passed to Acl::add_resource() must be an instance of Acl_Resource, instance of AclResource given deben editar el mismo archivo acl.php en la linea 210 encontraran:

	public function add_resource(Acl_Resource $resource) {

Sustituimos con la siguiente linea (el nombre de la clase):

	public function add_resource(AclResource $resource) {