Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/09/2013, 08:51
wilmer30
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

Hola:

Tengo un pequeño problema con la autenticación de los usuarios, pues por necesidad tube que crear 2

plugin, el primero ayuda a desabilitar el layout cuando hago un request AJAX en todos los módulos y

controladores y el segundo ayuda a establecer los permisos de Zend_Acl que tambien se activa al usar

cualquier módulo y controlador, mi problema esta en el segundo plugin de Zend_Acl en este tambien

tube que incluir la autenticación así:
Código PHP:
class ServiceControl extends Zend_Controller_Plugin_Abstract {    
    public function 
preDispatch(Zend_Controller_Request_Abstract $request) {
        
$auth Zend_Auth::getInstance();
        if (! 
$auth->hasIdentity ()) {
            
$request->setModuleName("default");
            
$request->setControllerName("index");
            
$request->setActionName("login");
            return ;
        }
        
//Si llega aqui significa que el usuario está autenticado
        
$auth Zend_Auth::getInstance ();
        
$userIdentity $auth->getIdentity ();
        
$role = new HistousuarioRepository ();
        
$role $role->getRole($userIdentity['id'] );
        
$resource $request->getModuleName() . ':' $request->getControllerName() . ':' 

$request->getActionName();
        
$acl Zend_Registry::get('acl');
        if(!
$acl->isAllowed $role$resource )){
            die(
"No tiene acceso");
        }
    }    

Entonces cuando me encuantro en cualquir módulo y controlador, el plugin empieza a trabajar si el

usuario está autenticado obetnemos el rol del mismo, obtenemos el recurso y verificamos si dicho rol

tiene acceso al recurso.

Pues bien, paralelamente en el Bootstrap tengo el _initNavigations() el cual se encarga de generar el

menú del sistema, pero el menú es generado según los permisos que tenga un rol a un determinado Menú

(Recurso).

Mi problema, cuando el proceso de autenticación sea satisfactorio, debería reenviarme a la página

principal del sistema y lo hace pero con defectos,

1. En la página principal no me sale el menú dinámico del rol (usuario) autenticado.
2. Aunque de fondo se encuentra la página princial del sistema, como primer plano continúa

apareciendome el formulario de autenticación.

Asi es como redirijo cuando el usuario es logueado satisfactoriamente:
Código PHP:
        if(!$form->isValid($this->getRequest()->getPost() )){
            
//Los datos introducidos no son válidos para el formulario
            
$this->view->message 'El usuario y la contraeña debe tener al menos 3 

caracteres'
;
            return 
$this->_helper->redirector->getRedirectUrl('/default/index/login');
        } else {
            
//Los datos introducidos son válidos para el formulario
            
$user $this->_getParam 'username' );
            
$pass md5 $this->_getParam 'password' ) );
            
            
//buscando en la base al usuario
            
$adapter = new ApplicationAuthDoctrineAuthAdapter $this->em$user

$pass);
            
$result Zend_Auth::getInstance ()->authenticate $adapter );
            
            
//buscnado la identidad encontrada
            
if(Zend_Auth::getInstance()->hasIdentity()){
                
$userauth $result->getIdentity();
                    
                
//Cargamos los datos importantes para el sistema
                
$user = new Zend_Session_Namespace('usuario');
                
$user->userId $userauth['id'];
                
$user->userUser $userauth['usuario'];
                
$user->userNombres $userauth['nombres'];
                
$user->userApellidos $userauth['apellidos'];
                
$user->userRoleId $userauth['roleid'];
                
$user->userTipo $userauth['defecto'];
                
$user->userRole $userauth['name'];
                return 
$this->_helper->redirector->getRedirectUrl('/');
            } else {
                
$this->view->message implode(' ' ,$result->getMessages());
            }
        } 
Gracias por su ayuda