Edición de «Ejemplo de ACL con Spirit Beta2»

De KumbiaPHP Framework Wiki

Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si inicias sesión o creas una cuenta, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.

Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así efectuar la reversión.

Revisión actual Tu texto
Línea 1: Línea 1:
{{cleanupbox
+
Bueno señores luego de varias peticiones que hicieron para que publicáramos un ejemplo acerca de la utilización de ACL aquí pondré un pequeño ejemplo que servirá de base para que puedan crear uno mas avanzado.
|image=[[Archivo:Information_icon4.png|45px]]
 
|texto ='''Este Artículo cumple con todos los requerimientos de los Kumbieros.'''<br />
 
}}
 
  
 
+
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 autenticación de los usuarios será tratada en otro ejemplo, por eso no explicamos ese tema aquí).
 
 
 
 
 
 
 
La estructura base de la tabla será:
 
  
 
<source lang="sql" line>
 
<source lang="sql" line>
Línea 21: Línea 13:
 
</source>
 
</source>
  
 +
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:
== Creación de permisos ==
 
 
 
 
 
Se procede a modificar el archivo app_controller.php de la siguiente forma:
 
  
 
<source lang="php" line>
 
<source lang="php" line>
class AppController extends Controller {
+
class ApplicationController extends Controller {
+
public $acl;
public $acl; //variable objeto ACL
+
public $userRol = "";
public $userRol = ""; //variable con el rol del usuario autenticado en la aplicación
 
 
 
 
final protected function initialize(){
 
final protected function initialize(){
Línea 38: Línea 26:
 
 
 
$this->acl = new Acl();
 
$this->acl = new Acl();
//Se agregan los roles
+
// Agregando 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
 
 
//Se agregan los recursos
+
// Agregando 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");
 
 
//Se crean los permisos
+
// Permitiendo el acceso
// 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 61: Línea 49:
 
</source>
 
</source>
  
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.
+
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.
  
== Comprobación de Permisos ==
+
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.
  
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
+
Ahora explicaremos que hace cada linea siguiente
  
 
<source lang="php" line>
 
<source lang="php" line>
$this->acl->allow("U", "test", array("index"));  
+
$this->acl->allow("", "index", array("index"));
 
</source>
 
</source>
 +
 +
Esta linea le otorga permisos a los visitantes en la acción index del controlador index
  
 
<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"));
 
 
$this->acl->allow("U", "index", array("index")); //Le otorga permisos a los usuarios autenticados en la acción index del controlador index
 
 
</source>
 
</source>
  
 +
Esta linea le otorga permisos a los usuarios autenticados en la acción index del controlador index
  
 +
<source lang="php" line>
 +
$this->acl->allow("U", "test", array("index"));
 +
</source>
  
 +
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
  
  
== Controllers ==
+
Ahora crearemos el controlador test_controller.php para probar este ejemplo y será de la siguiente forma:
 
 
 
 
Se crea el controlador test_controller.php para probar el ejemplo:
 
  
 
<source lang="php" line>
 
<source lang="php" line>
class TestController extends AppController{
+
class TestController extends ApplicationController{
 
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}");
 
}
 
}
 
 
protected function before_filter(){
+
public 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 102: Línea 92:
 
</source>
 
</source>
  
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.
+
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.
  
 
<source lang="php" line>
 
<source lang="php" line>
Línea 108: Línea 98:
 
</source>
 
</source>
  
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 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.
 
 
== Usando ACL en la Beta1 spirit ==
 
 
 
 
 
'''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:
 
 
 
<source lang="php" line>
 
/*foreach($this->access[$role] as ){
 
 
 
}*/
 
</source>
 
 
 
Debajo de esas lineas pueden colocar las dos lineas siguientes
 
 
 
<source lang="php" line>
 
if(!isset($this->access[$role][$resource][$access_list])) return false;
 
if($this->access[$role][$resource][$access_list] == "A") return true;
 
</source>
 
 
 
Y quedaría de la siguiente forma
 
 
 
<source lang="php" line>
 
/*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;
 
</source>
 
 
 
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]]
 

Ten en cuenta que todas las contribuciones a KumbiaPHP Framework Wiki pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre (véase Proyecto:Derechos de autor para más detalles). ¡No uses textos con copyright sin permiso!

Para editar esta página, responde la pregunta que aparece abajo (más información):

Cancelar Ayuda de edición (se abre en una ventana nueva)

Plantilla usada en esta página: