Foros del Web » Programando para Internet » PHP » Zend »

Usar Zend Acl con Zend Framework

Estas en el tema de Usar Zend Acl con Zend Framework en el foro de Zend en Foros del Web. Hola sergemedina, estoy haciendo algo parecido a lo q propones pero no logro que me corran las acls me pierdo en l bootstrap, me pòdrias ...
  #1 (permalink)  
Antiguo 25/06/2009, 08:39
 
Fecha de Ingreso: junio-2009
Mensajes: 7
Antigüedad: 14 años, 10 meses
Puntos: 0
Usar Zend Acl con Zend Framework

Hola sergemedina, estoy haciendo algo parecido a lo q propones pero no logro que me corran las acls me pierdo en l bootstrap, me pòdrias facilitar tus escripts o mas informaciom para tratar de configurarlos bien, te lo agradeceria bastante. Gracias
  #2 (permalink)  
Antiguo 25/06/2009, 09:21
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Aplicacion Modular con Zend Framework

Tengo lo siguiente:

Un plugin del controller que me permite "cachar" el request que se hace a la aplicación, y saber si un "rol" tiene permitido usar un "recurso"

Código PHP:
<?php
/**
 * Description of Acl
 *
 * @author sergiom
 */
class Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
    protected 
$_acl null;

    protected 
$_auth null;

    public function  
__construct(Zend_Auth $authZend_Acl $acl)
    {
        
$this->_acl $acl;
        
$this->_auth $auth;
    }

    public function 
preDispatch(Zend_Controller_Request_Abstract $request)
    {
        
$role 'DEFAULT';
        if(
$this->_auth->hasIdentity()) {
            
$userSession $this->_auth->getStorage()->read();
            
$role $userSession->Perfil;
        }

        
$resource $request->getModuleName();

        if(
$this->_acl->isAllowed($role$resource) && $role != 'DEFAULT') {
                return 
true;
                
//es permitido el usuario a ver el modulo requerido.
        
} else {
            if(
$resource != 'default'){
               
//Mediante este parametro veo si mostrare un mensaje de error
                
$request->setParam('error'true); 
            }
            
$request->setModuleName('default')
                    ->
setControllerName('index')
                    ->
setActionName('index');
        }
    }
}
En mi bootstrap tengo lo siguiente:

Código PHP:
//....
protected function _initLoadAuth()
{
        
$front Zend_Controller_Front::getInstance();
        
$front->registerPlugin(new Plugin_Acl(Zend_Auth::getInstance(), new Default_Model_ListaAcceso()));
}
//... 
La implementación del ACL ya es por tu cuenta, es muy sencilla, únicamente tienes que añadir recursos, roles y permisos.

Me he basado en articulos:
http://blog.astrumfutura.com/archive...Revisited.html
http://weierophinney.net/matthew/arc...to-Models.html
__________________
I see dead pixels
  #3 (permalink)  
Antiguo 07/07/2009, 14:40
 
Fecha de Ingreso: junio-2009
Mensajes: 7
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Aplicacion Modular con Zend Framework

hola otra vez, sigo lidiando con el Zend Acl, ahora mi problema es como saco el rol del usuario de mi base de datos si cuando hago:

if ($this->_auth->hasIdentity()) {
$role = $this->_auth->getIdentity()->role;
} else {
$role = 'guest';
}

o

if ($this->_auth->hasIdentity()) {
$role = $this->_auth->getIdentity()->getUser()->role;
} else {
$role = 'guest';
}

no me muestra nada, por favor alguien ha implementado este paso es lo unico que me falta para lograr mi login con acceso a recursos. espero sus respuestas.

Gracias.
  #4 (permalink)  
Antiguo 07/07/2009, 14:54
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Aplicacion Modular con Zend Framework

Hola Daniko.

con la linea $this->_auth->getIdentity(), lo unico que obtienes es el nombre de usuario, lo que tendrias que hacer sería "Serializar" el nombre de usuario y el rol, o aquellos datos que requieras, te doy un ejemplo de mi aplicación:

Código PHP:

if(!$this->_authenticate()->isValid()) {
            return 
false;
        } else {
            
$auth Zend_Auth::getInstance();
            
$storage $auth->getStorage();
            
$storage->write(array('Usuario' => 'Un Usuario''Rol' => 'rol'));
            return 
true;
        } 
Con la funcion getStorage() lo que haces es obtener una instancia de el metodo que utiliza para guardar los datos de usuario, por default utiliza sesiones, pero lo puedes configurar.
__________________
I see dead pixels
  #5 (permalink)  
Antiguo 07/07/2009, 16:10
 
Fecha de Ingreso: junio-2009
Mensajes: 7
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Usar Zend Acl con Zend Framework

Donde haria este codigo dentro del plugin del ACL o en otro script, podrias darme mas informacion, estoy revizando y no lo comprendo muy bien. gracias
  #6 (permalink)  
Antiguo 08/07/2009, 07:52
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Usar Zend Acl con Zend Framework

Yo ese código lo utilizo en un modelo de usuario, en donde tengo un método que verifica que un usuario sea valido, y si es valido que Perfil o Rol tiene. Como es que estas manejando el control de usuarios?
__________________
I see dead pixels
  #7 (permalink)  
Antiguo 08/07/2009, 08:57
 
Fecha de Ingreso: junio-2009
Mensajes: 7
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Usar Zend Acl con Zend Framework

Hola te voy a poner el codigo que estoy utilizando:

Plugin_Acl.php

Código PHP:
class Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
protected 
$_acl null;

    protected 
$_auth null;

    public function  
__construct(Zend_Auth $authZend_Acl $acl)
    {
        
$this->_acl $acl;
        
$this->_auth $auth;
    }

    public function 
preDispatch(Zend_Controller_Request_Abstract $request)
    {
        
$role 'guest';
        if(
$this->_auth->hasIdentity()) {
            
$userSession $this->_auth->getStorage()->read();
            
$role $userSession->rol;
        }

        
$resource $request->getModuleName();

        if(
$this->_acl->isAllowed($role$resource) && $role != 'guest') {
                return 
true;
                
//es permitido el usuario a ver el modulo requerido.
        
} else {
            if(
$resource != 'default'){
               
//Mediante este parametro veo si mostrare un mensaje de error
                
$request->setParam('error'true); 
            }
            
$request->setModuleName('default')
                    ->
setControllerName('index')
                    ->
setActionName('index');
        }
    }

donde rol es una cmpo de mi tabla usuario.

My_Acl.php

Código PHP:
class My_Acl extends Zend_Acl
{
public function 
__construct(Zend_Auth $auth)
    {
        
// Add Resources

        // Resource #1: Default Module
        
$this->add(new Zend_Acl_Resource('default'));
        
// Resource #2: Admin Module
        
$this->add(new Zend_Acl_Resource('admin'));

        
// Add Roles

        // Role #1: Guest
        
$this->addRole(new Zend_Acl_Role('guest'));
        
// Role #2: Author (inherits from Guest)
        
$this->addRole(new Zend_Acl_Role('author'), 'guest');

        
// Assign Access Rules

        // Rule #1 & #2: Guests can access Default Module (Author inherits this)
        
$this->allow('guest''default');
        
// Rule #3 & #4: Authors can access Admin Module (Guests denied by default)
        
$this->allow('author''admin');
    }

el modelo lo tengo asi :

User.php

Código PHP:
class User extends Zend_Db_Table
{
    protected 
$_name 'users';
     


Ahora bien el resultado me sale lo siguiente:
Cita:
Message: Resource 'default' not found
El codigo q me diste anteriormente no se donde ponerlo en el User.php y como jalarlo en el Plugin_Acl.php

Help me please.
  #8 (permalink)  
Antiguo 08/07/2009, 09:56
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Usar Zend Acl con Zend Framework

Yo pondria el codigo que te di en el modelo del usuario. Porque en el plugin del ACL solo le corresponderia verificar si el rol que tiene asignado el usuario es valido o no.

Por lo tanto, podrias ponerlo en el model Usuario y usar este metodo en tu controller.
podria quedar algo asi:
Código PHP:
//.......
public function isValid()
{
        
//Aqui usas cualquier adaptador de Auth que se te acomode
        
$adapter = new Zend_Auth_Adapter_DbTable($this->user$this->pass);
        
//Configuracion de tu adaptador
        //....
        
if(!$adapter->authenticate()->isValid()) {
            return 
false;
        } else {
            
$auth Zend_Auth::getInstance();
            
//Obtienes el storage de auth, por default son sesiones.
            
$storage $auth->getStorage();
            
//Puedes guardar  un objeto, un array, o lo que sea que quieras
            //que sea persistente
            
$storage->write(array('User' => $this->user'rol' => $this->rol ));
            return 
true;
        }

__________________
I see dead pixels
  #9 (permalink)  
Antiguo 08/07/2009, 12:01
 
Fecha de Ingreso: junio-2009
Mensajes: 7
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Usar Zend Acl con Zend Framework

Gracias por la ayuda sergemedina, creo que me esta a punto de salir, ahora solo el problema q no me obedece a las reglas de ACl y me sale el siguiente error

Cita:
Message: Resource 'default' not found
no me muestra el formulario del login

tengo 3 modulos a los que quiero acceder : admin y clientes, noticias.

mis roles son:si el usuario tiene como rol author accede al modulo clientes
si el usuario tiene como rol admin accede al modulo admin.
si el usuario tiene como rol guest accede al modulo noticias.

En el modulo default tengo todo referente a la autenticacion.

me puedes ayudar y disculpa la molestia.
  #10 (permalink)  
Antiguo 08/07/2009, 14:31
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Usar Zend Acl con Zend Framework

Creo que en esta linea
Código PHP:
//...
if($this->_acl->isAllowed($role$resource) && $role != 'guest'){
//... 
debe de ir:


Código PHP:
//...
if($this->_acl->isAllowed($role$resource)){
//... 
__________________
I see dead pixels
  #11 (permalink)  
Antiguo 09/07/2009, 12:23
 
Fecha de Ingreso: junio-2009
Mensajes: 7
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Usar Zend Acl con Zend Framework

Disculpa sergemedina, hize tal como me digiste pero no me toma el rol de mi usuario y por defecto toma el usuario guest, que puede estar fallando??
  #12 (permalink)  
Antiguo 10/07/2009, 08:36
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Usar Zend Acl con Zend Framework

Instala Firebug y Firephp en Firefox para que hagas un "debug" de todo el proceso de login y veas que esta mal. Haces los logs con Zend_Log de esta forma:
Código PHP:
$writer = new Zend_Log_Writer_Firebug();
$logger = new Zend_Log($writer);
//para usarlo
$logger->debug("Mi mensaje de log"); 
__________________
I see dead pixels
  #13 (permalink)  
Antiguo 16/07/2009, 15:28
 
Fecha de Ingreso: junio-2009
Mensajes: 7
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Usar Zend Acl con Zend Framework

Hola sergeMedina, pude descubrir que el problema no era el rol del usuario sino no toma el resource, en mi caso deberia ser un modulo, estoy centrado en solucionar este problema cualquier ayuda es bienvenido cualquier resultado lo posteo. Gracias me ayudaste mucho.
  #14 (permalink)  
Antiguo 17/07/2009, 11:30
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Usar Zend Acl con Zend Framework

Hola daniko, Que te parece si escribes el codigo y pones detalles sobre donde falla y que esperas que haga, ya probaste correr el codigo paso a paso con algun debugger para PHP?
__________________
I see dead pixels
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 12:32.