Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Ejemplo ACL con Clases

Estas en el tema de Ejemplo ACL con Clases en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola todos los ejemplos que he visto para hacer ACL es con PHP no utiliza ninguna clase. Sabeis de algun Ejemplo para utilizar ACL en ...
  #1 (permalink)  
Antiguo 16/02/2010, 14:33
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 15 años, 5 meses
Puntos: 1
Ejemplo ACL con Clases

Hola todos los ejemplos que he visto para hacer ACL es con PHP no utiliza ninguna clase.

Sabeis de algun Ejemplo para utilizar ACL en clases. Lo mas parecido que he visto a sido esto:

Código PHP:
class MyAcl extends Zend_Acl
{
    public function 
__construct(Zend_Auth $auth)
    {
        
parent::__construct();

        
$roleGuest = new Zend_Acl_Role('guest');

        
$this->add(new Zend_Acl_Resource('home'));
        
$this->add(new Zend_Acl_Resource('news'));
        
$this->add(new Zend_Acl_Resource('tutorials'));
        
$this->add(new Zend_Acl_Resource('forum'));
        
$this->add(new Zend_Acl_Resource('support'));
        
$this->add(new Zend_Acl_Resource('admin'));

        
$this->addRole(new Zend_Acl_Role('guest')); 
        
$this->addRole(new Zend_Acl_Role('member'), 'guest');
        
$this->addRole(new Zend_Acl_Role('admin'), 'member');

        
// Guest may only view content
        
$this->allow('guest''home');
        
$this->allow('guest''news');
        
$this->allow('guest''tutorials');
        
$this->allow('member''forum');
        
$this->deny('member''forum''update'); // Remove specific privilege
        
$this->allow('member''support');
        
$this->allow('admin'); // unrestricted access

        // Add authoring ACL check
        
$this->allow('member''forum''update', new MyAcl_Forum_Assertion($auth));
        
// NOTE: Dependency on auth object to allow getIdentity() for authenticated user object
    
}

Pero luego no viene como y desde donde llamar a esta clase, ni como denegar o permitir Action de los diferentes Controller de la aplicacion.

Muchas Gracias
  #2 (permalink)  
Antiguo 17/02/2010, 01:38
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Ejemplo ACL con Clases

Cita:
Pero luego no viene como y desde donde llamar a esta clase, ni como denegar o permitir Action de los diferentes Controller de la aplicacion.
Se me olvido comentar, en la clase que publicaste es donde indicas si deniegas o permites el acceso a los módulos/controladores/acciones dependiendo del rol del usuario que los solicita, hay mismo indicas los roles que tu aplicación soportará

Ahora tienes que crear un Controller_Plugin para verificar estos datos, un ejemplo seria:
Código PHP:
Ver original
  1. class My_Plugins_Acl extends Zend_Controller_Plugin_Abstract
  2. {    
  3.     public function __construct() {
  4.         $this->_auth = Zend_Auth::getInstance();
  5.         $this->_acl = new My_Acl();
  6.     }
  7.    
  8.     public function preDispatch(Zend_Controller_Request_Abstract $request) {
  9.         //Obtengo las credenciales del usuario
  10.         $role = $this->_auth->hasIdentity() ? $this->_auth->getInstance()->getIdentity()->role : 'guest';
  11.        
  12.         //Tomamos el nombre del recurso actual (action,controller,module)
  13.         if ($this->_acl->has($this->getRequest()->getActionName())) {
  14.             $resource = $this->getRequest()->getActionName();
  15.         }else if ($this->_acl->has($this->getRequest()->getControllerName())) {
  16.             $resource = $this->getRequest()->getControllerName();
  17.         }else if ($this->_acl->has($this->getRequest()->getModuleName())) {
  18.             $resource = $this->getRequest()->getModuleName();
  19.         }
  20.        
  21.         //Ahora verificaremos los permisos
  22.         //Si no pasa la prueba (!$this->_acl_isAllowed), entonses el usuario no a iniciado sesion y si
  23.         //el rol es guest mando al modulo auth a iniciar session
  24.         if (!$this->_acl->isAllowed($role,$resource) && $role == 'guest') {
  25.             $request->setModuleName('default');
  26.             $request->setControllerName('authentication');
  27.             $request->setActionName('sigin');
  28.         }
  29.        
  30.         //Ahora si no ah pasado la prueba y NO ES guest, entonses muestro un mensaje de error
  31.         if (!$this->_acl->isAllowed($role, $resource)) {
  32.             $request->setModuleName('default');
  33.             $request->setControllerName('authentication');
  34.             $request->setActionName('error');
  35.         }
  36.     }
  37. }
  38. ?>

y por ultimo registramos el plugin en el Bootstrap.php

Código PHP:
Ver original
  1. public function _initPlugins() {
  2.         $this->bootstrap('frontController');
  3.        
  4.         //Registro los plugins
  5.         $this->frontController->registerPlugin(new My_Plugins_Acl());
  6.     }

Pero para esto, tienes que combinar Zend_Acl con Zend_Auth para que funcione!!!
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Última edición por Nemutagk; 17/02/2010 a las 01:43
  #3 (permalink)  
Antiguo 17/02/2010, 07:39
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Ejemplo ACL con Clases

El Zend_Auth lo tengo bien hecho, lo hice con una clase dentro de controller AuthController.php.

Tengo una duda, no he visto la relacion entre el Usuario que hace login y su rol.

El Zend_Auth comprueba el login y el password del usuario en la base de datos, pero luego quien controla que ese login tiene ese rol.

Gracias
  #4 (permalink)  
Antiguo 17/02/2010, 08:40
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Ejemplo ACL con Clases

En tu tabla de usuarios tienes que tener un campo llamado "role" y sus posibles valores serian 'guest','user' y 'admin' por poner un ejemplo, cuando autentificas el usuario con Zend_Auth esta información debe ser guardada, ejemplo:

Código PHP:
Ver original
  1. //Despues de verificar los datos guardamos información del usuario
  2.                 //y nos aseguramos de tomar el campo role
  3.                 $identity = $authAdapter->getResultRowObject(array('id','user','role','email'));
  4.                 $authStorage = $auth->getStorage();
  5.                 $authStorage->write($identity);

Despues en el plugin "My_Plugins_Acl" obtenemos el rol del usuario desde el storage de Zend_Auth

Código PHP:
Ver original
  1. //Aquí es donde se obtiene el "role" del usuario, si este se logueo con
  2.         //Zend_Auth, recuperamos su identidad y verificamos el role, si no inicio
  3.         //sesion, le asignamos el "role" guest
  4.         $role = $this->_auth->hasIdentity() ? $this->_auth->getInstance()->getIdentity()->role : 'guest';
  5.  
  6.         //Posteriormente verificamos si el usuario tiene un role o si es visitante
  7.         if (!$this->_acl->isAllowed($role,$resource) && $role == 'guest') {
  8.                 //Acciones si el usuario es visitante o "guest"
  9.         }
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Última edición por Nemutagk; 17/02/2010 a las 08:46
  #5 (permalink)  
Antiguo 24/02/2010, 11:16
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Ejemplo ACL con Clases

Una pregunta en cuanto a los permisos

Para asignar un Modulo
Código PHP:
$this->add(new Zend_Acl_Resource('idomas')); 
Para asignar un Controller de un Modulo
Código PHP:
$this->add(new Zend_Acl_Resource('control1'), 'idiomas'); 
Pero para asignar a una Action dentro del Módulo como es?

Última edición por Ferdinandum; 24/02/2010 a las 14:08
  #6 (permalink)  
Antiguo 24/02/2010, 14:37
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Ejemplo ACL con Clases

Con esta linea

Código PHP:
$identity $authAdapter->getResultRowObject(array('id','username','role')); 
Se supone que guardas el id, el username y el rol pero cuando imprimo por pantalla no me sale

Código PHP:
        echo 'ID='.Zend_Auth::getInstance()->getIdentity()->id;
        echo 
' Username='.Zend_Auth::getInstance()->getIdentity()->username;
        echo 
' ROL='.Zend_Auth::getInstance()->getIdentity()->role
ID=4
Notice: Undefined property: stdClass::$username in D:\wamp\www\kysurf\application\modules\default\con trollers\IndexController.php on line 32
Username=
ROL=

Es curioso, si que me saca el ID pero no me saca ni el rol ni username, es mas en el username me salta error, a que puede ser debido?

Última edición por Ferdinandum; 24/02/2010 a las 14:51
  #7 (permalink)  
Antiguo 24/02/2010, 20:04
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Ejemplo ACL con Clases

Para tu primera pregunta:

No es necesario indicar en los "Resources" los "action", al agregar el "controller" este es agregado sus "action", despues en los permisos es donde aceptas o deniegas el acceso a ellos

Código PHP:
Ver original
  1. $this->allow('user','controller',array('action1','action2'));
  2. $this->deny('user','controller',array('action3','action4'));

Para mas información pasate por el manual (Zend_Acl)

Para tu segunda pregunta tendiamos que ver como estas "autenticando" el usuario, ahora, otra pregunta, los campos existen en tu base de datos?, ya intentaste un "var_dump(Zend_Auth::getInstance()->getIdentity())"?
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #8 (permalink)  
Antiguo 26/02/2010, 09:59
 
Fecha de Ingreso: noviembre-2008
Mensajes: 62
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Ejemplo ACL con Clases

Ok pero en este if intenta buscar que ACL tienes empezando por Action.

[QUOTE=Nemutagk;3284950]
//Tomamos el nombre del recurso actual (action,controller,module)
if ($this->_acl->has($this->getRequest()->getActionName())) {
$resource = $this->getRequest()->getActionName();
}else if ($this->_acl->has($this->getRequest()->getControllerName())) {
$resource = $this->getRequest()->getControllerName();
}else if ($this->_acl->has($this->getRequest()->getModuleName())) {
$resource = $this->getRequest()->getModuleName();
}
[/HIGHLIGHT]

Por ejemplo tengo El Modulo Cuentas, con el controler Index y la acciones Index, Mostrar y tambien tengo el controller Estadísticas con un par de acciones

Seria correcto esto:
Código PHP:
//Recurso
$this->add(new Zend_Acl_Resource('Cuentas')); 
//Controller Index
$this->allow('user1','Index',array('Index');
//Controller Estadistica
$this->deny('user1','Estadisticas', array('Accion1','Accion2'))
$this->allow('user1','Estadisticas', array('Accion3'

Etiquetas: acl, clases, ejemplo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:18.