Problemas al obtener valores de sesión

edited octubre 2008 in Dudas/Problemas
Buen día a todos, explico cual es la situación:

Tengo un sistema basado en kumbia 0.4.7, la seguridad usando phpgacl y una clase Usuario que almacena el login. El objeto generado por la clase Usuario se almacena en variables de sesión y la validación de privilegios del usuario se hace comparando el login con la lista ACL de phpgacl en el metodo before_filter, hasta aquí no hay ningún problema.

Además de eso, modifique el archivo /kumbia.php línea 243, para poder redireccionar a otro controlador en caso de que el usuario ingrese en la URL un controlador que no existe, comenté la excepción y agregué la siguiente línea:
ApplicationController :: redirect('sesion/restringir');

La redirección funciona bien, el problema comienza al invocar el método before_filter después de un error de controlador no encontrado. Describo lo que observé depurando:

1. al ingresar en la URL un controlador no existente, kumbia redirecciona a 'sesion/restringir'
2. el metodo before filter intenta leer el objeto desde el arreglo de session
$usr = Session :: get_data('usr');
3. para todas las demas redirecciones funciona de forma correcta, solo en la redireccion que agregué a la clase kumbia la variable usr carga entre los atributos del objeto algo como:

__PHP_Incomplete_Class_Name

Después de buscar en google se me ocurre que podría haber un problema de serialización por llamar el método tan 'a la brava' <!-- s:wink: --><img src="{SMILIES_PATH}/icon_wink.gif" alt=":wink:" title="Wink" /><!-- s:wink: -->...

Alguna idea de como ajustarlo? Por donde empezar a revisar?

De antemano muchas gracias
Saludox

Comentarios

  • En primer lugar me gustaría ver la implementacion del before_filter donde estas teniendo problema...

    Lo otro seria que trataras de migrar tu código a la versión 0.5, esta versión esta muy estable y la migración es muy sencilla, serán muy pocas las lineas que modifiques...

    Y por ultimo me gustaría ver como implementaste las lib phpgacl nose si este en tu disposición enviarme un código explicativo sobre el tema...

    Gracias
  • edited 10:33
    gracias por contestar <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->

    adjunto la implementacion de phpgacl con kumbia a nivel vista y controlador... si a alguien le sirven ps adelante usenlo

    el gacl no me da problemas, de hecho creo que se integra muy bien... el problema se presenta solo cualdo redirecciono despues de un error de controlador no deifinido

    este es el /lib/phpgacl/main.php
    &lt;?php
    require_once 'gacl&#46;class&#46;php';
    require_once 'gacl_api&#46;class&#46;php';
    
    ?&gt;
    

    y este es el metodo before filter
    public function before_filter($controlador, $accion, $evento) {
    		$controlador  =  strtolower($controlador);
    		$accion 	  =  strtolower($accion);
    		$this-&gt;evento = $evento =  strtolower($evento);
    
    		if (!Session &#58;&#58; isset_data('usr')) {
    			Session &#58;&#58; set_data('usr', new Usuario());
    		}
    		$usr = Session &#58;&#58; get_data('usr');
    		$acl = new gacl();
    		if( !$acl-&gt;acl_check('ALL', 'ALL', 'usuarios', $usr-&gt;login) &amp;&amp;
    			!$acl-&gt;acl_check($controlador, 'ALL', 'usuarios', $usr-&gt;login) &amp;&amp;
    			!$acl-&gt;acl_check($controlador, $accion, 'usuarios', $usr-&gt;login)
    		){
    			
    	
    			if($evento != sha1('err_login') &amp;&amp; $evento != ''){
    				$this-&gt;redirect('sesion/autenticar/' &#46; sha1(time()), 0);
    			}
    			return false;
    		}
    		
    		$this-&gt;controlador_global  =  $controlador;
    		$this-&gt;accion_global 	   =  $accion;		
    	}
    

    lo de validar el evento es para evitar que los redirects se cilcen, ya que redirecciono a sesion/restringir cuando alguien teclea mal una URL

    eso de migrar a la version 0.5 me interesa, cuales son las lineas que tendría que mover?

    saludox
  • edited 10:33
    por cierto... no publique todo el modulo de manipulacion de usuarios integrando phpgacl porque aun no está completamente depurado, pero cuando esté listo lo subo con la documentación pertinente

    GNU GNU GNU GNU GNU! <!-- s:mrgreen: --><img src="{SMILIES_PATH}/icon_mrgreen.gif" alt=":mrgreen:" title="Mr. Green" /><!-- s:mrgreen: -->

    saludox a todos
  • Además de eso, modifique el archivo /kumbia.php línea 243, para poder redireccionar a otro controlador en caso de que el usuario ingrese en la URL un controlador que no existe, comenté la excepción...
    Una de las ventajas de la version 0.5 (después del Release) fue la implementacion de una vista que se llama not_found.phtml que se muestra cuando no se encuentra una action o un controller, esto para evitar la desagradable exception que se muestra exactamente la que tu modificaste...
    Como te dije antes esta muy stable han sido poco los Bug's reportados y yo que la utilizo a diario y no me ha dado problemas como para que se me caiga el cabello...
    Si deseas esta versión lo ideal es que la bajes del SVN...

    Volviendo al tema de tu implementacion del before_filter todo esta bien me puedes dar el error que te muestra en el navegador...
  • edited 10:33
    De hecho el navegador no me manda un error por los redireccionamientos que le agregué...

    Mira te platico mas a fondo como funciona la seguridad en ese punto;

    al intentar acceder a cierto controlador/vista, este se revisa en el ACL, si no se encuentra se envia a sesion/restringir,

    la cosa es que un usuario logeado de forma correcta (digamos root) puede cometer el error de escribir mal una URL, lo logico sería enviarlo a sesion/restringir y hasta aqui todo bien...

    despues de un error de URL el usuario intentará acceder a otra página, digamos (inicio/index),

    el ACL revisará otra vez en el metodo before_filter si el usuario tiene o no privilegios

    en esta parte se intenta leer el objeto Usuario que se almacenó en $_SESSION (todo esto usando las funciones del framework), aqui comienzan los problemas, la estructura esta corrupta y usando XDEBUG pude notar que el objeto muestra el siguiente mensaje

    __PHP_Incomplete_Class_Name

    el problema es que despues de esto la estructura Usuario ya no se puede utilizar y el usuario se redirecciona a sesion/autenticar, es decir, tiene que volver a loggear...

    Agradezco mucho la atención que se ha tenido a mis preguntas, por acá sigo buscandole una solución óptima y cuando esté lista la publico en el foro.

    saludox!
  • Hola, te propongo en primer lugar que evalues si la SESSION existe antes de preguntarle al Obj ACL si el usuario tiene permiso...
  • edited 10:33
    De hecho la sesion existe, lo he resuelto de una forma mas sencilla... En lugar de almacenar el objeto de la clase Usuario ($login, $id, $nombre), guardo tres variables en sesion 'usr.login', 'usr.id', 'usr.nombre'...

    Poco elegante pero funciona, con algo mas de tiempo lo depuro a fondo y encuentro cual es el problema...

    Gracias por la atención al post, me queda pendiente publicar aqui en el foro la integración kumbia-phpgacl, sigo trabajando en ello.

    Saludox! <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
  • Lo que sucede es que no se puede almacenar directamente un objeto en la sesion (recuerda que esto realmente se almacena en las cookies), antes este debe serializarse con la funcion serialize, de esta manera obtienes la representacion de un objeto en un string y ese valor si puede almacenarse en la sesion.

    Pienso que se puede modificar la clase Session para que reconozca estos casos y los haga directamente, seria algo muy practico.

    Saludos.
  • edited 10:33
    Asi es mi hermano, buena respuesta
    muchas gracias!
Sign In or Register to comment.