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

Zend_Acl

Estas en el tema de Zend_Acl en el foro de Zend en Foros del Web. Hola, estoy utilizando el modulo Zend_Acl y me funciona "casi" todo bien. Si quiero acceder a un controlador de esta forma: Código HTML: http:// ... ...
  #1 (permalink)  
Antiguo 01/05/2010, 13:36
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 11 meses
Puntos: 3
Zend_Acl

Hola, estoy utilizando el modulo Zend_Acl y me funciona "casi" todo bien.

Si quiero acceder a un controlador de esta forma:

Código HTML:
http:// ... /modulo/controlador
Si a ese controlador no puedo acceder, me redirige al controlador de Error, hasta aqui todo correcto.

El problema viene cuando pongo:

Código HTML:
http:// ... /modulo/controlador/action
NOTA: Con http://.../modulo/controlador/index funciona correctamente

Por ejemplo:

http:// ... /admin/trabajo/crear

me sale lo siguiente:

Código PHP:
Fatal errorUncaught exception 'Zend_Controller_Action_Exception' with message
 
'Action "crear" does not exist and was not trapped in __call()' in /Applications
/MAMP/htdocs/OperaSVN/library/Zend/Controller/Action.php:485 Stack trace#0
 
/Applications/MAMP/htdocs/OperaSVN/library/Zend/Controller/Action.php(515): 
Zend_Controller_Action->__call('crearAction', Array) #1 /Applications/MAMP/htdocs
/OperaSVN/library/Zend/Controller/Dispatcher/Standard.php(289): 
Zend_Controller_Action->dispatch('crearAction'#2 /Applications/MAMP/htdocs
/OperaSVN/library/Zend/Controller/Front.php(946): 
Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #3 /Applications/MAMP/htdocs
/OperaSVN/library/Bootstrap.php(159): Zend_Controller_Front->dispatch() #4 
/Applications/MAMP/htdocs/OperaSVN/library/Bootstrap.php(42): 
Bootstrap::_initFrontController() #5 /Applications/MAMP/htdocs/OperaSVN/public
/index.php(17): Bootstrap::main() #6 {main} thrown in /Applications/MAMP/htdocs
/OperaSVN/library/Zend/Controller/Action.php  on line 485 
y el action 'crear' existe y tiene su vista asociada. Es mas cuando entro a esa direccion con un ROL que sí tiene permisos para acceder, funciona correctamente.

El permisos que tengo son:

Código PHP:
$this->addRole(new Zend_Acl_Role('anonimo') );
        
$this->addRole(new Zend_Acl_Role('usuarioTematica'), 'anonimo' );
        
$this->addRole(new Zend_Acl_Role('usuarioGrupo'), 'anonimo' );
        
$this->addRole(new Zend_Acl_Role('admin'));
 
        
// Recursos de lo general a lo particular
        
$this->add(new Zend_Acl_Resource('default'));
        
$this->add(new Zend_Acl_Resource('grupo'));
        
$this->add(new Zend_Acl_Resource('tematica'));
        
$this->add(new Zend_Acl_Resource('admin'));
        
$this->add(new Zend_Acl_Resource('crear'));
        
$this->add(new Zend_Acl_Resource('usuario'));
 
        
// Asignar permisos
        // guest
        
$this->allow('anonimo', array('default') );
        
$this->deny('anonimo', array('grupo''tematica''admin''usuario') );
        
// user
        
$this->allow('usuarioTematica', array('usuario''tematica') );
        
$this->deny('usuarioTematica', array('admin''admin'));
        
        
$this->allow('usuarioGrupo', array('usuario''grupo') );
        
$this->deny('usuarioGrupo', array('admin','crear')); 
El Resource 'crear' lo he puesto para probar denegando acceso a ese action en particular en forma de prueba. En principio tendría que ser indicandolo con el resource 'admin'

Gracias

Un saludo
  #2 (permalink)  
Antiguo 01/05/2010, 23:26
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Zend_Acl

Por defecto Zend_Acl no tiene ninguna inferencia con el MVC, así que deberías de exponer como es que limitas la entrada en tus controladores, lo haces con un plugin o algo así?

Saludos.
  #3 (permalink)  
Antiguo 02/05/2010, 07:41
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 11 meses
Puntos: 3
Respuesta: Zend_Acl

Si claro, un plugin:

Código PHP:
<?php

/*
 * AuthorizationPlugin.php
 * Extensión de la clase Zend_Controller_Plugin_Abstract
*/
class My_AuthorizationPlugin extends Zend_Controller_Plugin_Abstract
{
    private 
$_auth;
    private 
$_acl;
 
    public function 
__construct(Zend_Auth $authZend_Acl $acl)
    {
            
$this->_auth $auth;
            
$this->_acl $acl;
    }
 
    public function 
preDispatch Zend_Controller_Request_Abstract $request )
    {
        
        
$datos $this->_auth->getStorage()->read();
        
$role $datos[1];
        if(
$role === null)
            
$role 'anonimo';
        
        
        if( 
$this->_acl->has$this->getRequest()->getActionName() ) )
            
$resource $this->getRequest()->getActionName();
        elseif( 
$this->_acl->has$this->getRequest()->getControllerName() ) )
            
$resource $this->getRequest()->getControllerName();
        elseif( 
$this->_acl->has$this->getRequest()->getModuleName() ) )
            
$resource $this->getRequest()->getModuleName();
        

        if ( !
$this->_acl->isAllowed($role$resource) && $role == 'anonimo' )
        {
            
$request->setModuleName('default');
            
$request->setControllerName('index');
        }
        elseif (!
$this->_acl->isAllowed($role$resource) )
        {
            
$request->setModuleName('default');
            
$request->setControllerName('error');
        }
 
    }
}
y esta registrado en el Bootstrap. lo que comentaba, algunas veces funciona bien (cuando se pone solo hasta el nombre del controlador), pero no funciona si se pone el nombre del action y no tiene permisos para entrar (Si el rol tiene permiso, funciona siempre correctamente)

Gracias

Un saludo
  #4 (permalink)  
Antiguo 02/05/2010, 23:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Zend_Acl

Yo creo en tu redirect de tu plugin te faltaría indicar el action a llamar para evitar caer en el error del catch.

Saludos.
  #5 (permalink)  
Antiguo 03/05/2010, 15:27
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 11 meses
Puntos: 3
Respuesta: Zend_Acl

Cierto, yo pensaba que intentaba entrar en el action crear del controlador propuesta del modulo tematica (segun el ejemplo que puse en el primer mensaje)

entonces al no tener permiso intenta entrar en: default/error/

y al no indicar el action, si intentamos entrar en tematica/propuesta/index

iria a: default/error/index (por eso no daba problemas, esa vista si existía)

y si queremos entrar en tematica/propuesta/crear, daba error porque queria entrar en: default/error/crear y daba el error de que no existia la vista.

Al final añadimos el action en el plugin:

Código PHP:
<?php

/*
 * AuthorizationPlugin.php
 * Extensión de la clase Zend_Controller_Plugin_Abstract
*/
class My_AuthorizationPlugin extends Zend_Controller_Plugin_Abstract
{
    private 
$_auth;
    private 
$_acl;
 
    public function 
__construct(Zend_Auth $authZend_Acl $acl)
    {
            
$this->_auth $auth;
            
$this->_acl $acl;
    }
 
    public function 
preDispatch Zend_Controller_Request_Abstract $request )
    {
        
        
$datos $this->_auth->getStorage()->read();
        
$role $datos[1];
        if(
$role === null)
            
$role 'anonimo';
        
        
        if( 
$this->_acl->has$this->getRequest()->getActionName() ) )
            
$resource $this->getRequest()->getActionName();
        elseif( 
$this->_acl->has$this->getRequest()->getControllerName() ) )
            
$resource $this->getRequest()->getControllerName();
        elseif( 
$this->_acl->has$this->getRequest()->getModuleName() ) )
            
$resource $this->getRequest()->getModuleName();
        

        if ( !
$this->_acl->isAllowed($role$resource) && $role == 'anonimo' )
        {
            
$request->setModuleName('default');
            
$request->setControllerName('index');
        }
        elseif (!
$this->_acl->isAllowed($role$resource) )
        {
            
$request->setModuleName('default');
            
$request->setControllerName('error');
            [
B]$request->setActionName('index');[/B]
        }
 
    }
}
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 11:14.