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

Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

Estas en el tema de Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl en el foro de Zend en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 04/09/2013, 09:51
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 9 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
  #2 (permalink)  
Antiguo 04/09/2013, 10:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

Si la navegación depende del usuario, y tienes el código dentro del Bootstrap, ese es el problema. Los plugins se ejecutan después del Bootstrap.

Debes de separar por capas, el Bootstrap es un punto de entrada donde poner el código necesario para que tu sistema este listo para empezar a trabajar (inicializar). Es en los plugins donde haces ya lógica, donde compruebas que el usuario X o Y tenga permisos y estableces lo que necesites en base a esa lógica.

Es incorrecto meter lógica en el bootstrap ya que esa no es su tarea, su tarea es solamente inicializar tu sistema.

Saludos.
  #3 (permalink)  
Antiguo 04/09/2013, 11:12
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 9 años, 10 meses
Puntos: 12
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

Este es mi Bootstrap, el primer metodo se encarga de generar el menu, el segundo de establcer los plugin y los permisos:
Código PHP:
Ver original
  1. protected function _initNavigations() {    
  2.         $this->bootstrap ( 'layout' );
  3.         $layout = $this->getResource ( 'layout' );
  4.         $view = $layout->getView ();
  5.         $this->bootstrap ( 'Doctrine' );
  6.         $arrayTree = new MenuRepository ();
  7.         $array = $arrayTree->getMenuList ();
  8.         $container = new Zend_Navigation ( $array );
  9.         $view->navigation ( $container );
  10.     }
  11.    
  12.     protected function _initPlugins() {
  13.         $front = Zend_Controller_Front::getInstance ();
  14.         //Registro del plugin: Interruptor Layout, con deteccion de peticiones del tipo ajax
  15.         $front->registerPlugin ( new \Application\Helpers\Plugin\LayoutSwitch());
  16.         //Registro del plugin: Control de Autenticacion y Accesibilidad (ACL)
  17.         $front->registerPlugin ( new \Application\Helpers\Plugin\ServiceControl());
  18.        
  19.         //Carga inicial de roles,recursos,privilegios
  20.         $helperAcl = new \Application\Helpers\Acl();
  21.         $helperAcl->setRoles();
  22.         $helperAcl->setResources();    
  23.         $helperAcl->setPrivilages();
  24.         $helperAcl->setAcl();
  25.     }
Cuando hablas de dos capas, como debería trabajarlo?
  #4 (permalink)  
Antiguo 04/09/2013, 12:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

¿y donde es donde generas el menu en base a los permisos?
  #5 (permalink)  
Antiguo 04/09/2013, 13:24
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 9 años, 10 meses
Puntos: 12
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

Es en MenuRepository(), lo que hago es obtener los permisos asignados de la tabla admitidos, es decir no uso Zend_Acl, simplemente obtengo los ides del menu al que el usuario (rol) tiene acceso y genero el menu del usuario.
  #6 (permalink)  
Antiguo 04/09/2013, 13:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

¿y como obtienes el usuario?
  #7 (permalink)  
Antiguo 04/09/2013, 19:06
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 9 años, 10 meses
Puntos: 12
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

cuando el usuario existe almaceno su id en una session Zend, pero en caso de que no exista el array para el menu es vacio, es decir no habrá menú.
  #8 (permalink)  
Antiguo 04/09/2013, 20:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

Es lo que te digo la sesión no la puedes leer en el Bootstrap, todo eso lo tienes que hacer en un plugin ya que el Bootstrap se ejecuta mucho antes.

Saludos.
  #9 (permalink)  
Antiguo 06/09/2013, 07:04
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 9 años, 10 meses
Puntos: 12
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

No estoy entendiendo bien, es decir tendría que generar un pugin adicional o leer la session en uno delos dos plugn exitentes?

De ser asi, tengo que pasarle el array del menú a Zend_Navigation que se ecuentra en otro método en el bootstrap, cómo haría eso.
  #10 (permalink)  
Antiguo 06/09/2013, 09:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Autenticación Defectuosa usando plugins, Zend_Navigation y Zend_Acl

Tendrías que generar otro plugin que su tarea fuera extraer los datos del menu en base a la sesión, eso no lo puedes hacer en el bootstrap.

Etiquetas: autenticación, plugins, usando
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:00.