Hola,
He descargado la aplicación de Cupón para Symfony2 de Javier Eguiluz, pero tengo un problema que no puedo resolver. Si intento logearme con un usuario que existe en la BD, entonces se logea correctamente. Pero si intento hacer login con un usuario que no existe, la aplicación se cuelga. Se queda procesando la petición de /login_check
constantemente y tengo que reiniciar Apache para que el navegador responda.
No se cómo solucionar esto, ¿Alguna idea por favor?
Muchas gracias.
Respuestas
¿Has añadido algún código que se ejecuta cuando se produce un error? Por ejemplo, si has puesto var_dump()
de alguna entidad Doctrine, lo "normal" es que se cuelgue (para evitarlo hay que usar el dump()
que proporciona Symfony). Si no has añadido nada, ¿puedes mirar si en el archivo de log se añade algún mensaje que nos pueda dar pistas de lo que está pasando?
@javiereguiluz
Hola Javier, muchísimas gracias por tu rápida respuesta. No he añadido nada al producirse errores, la instalación está virgen y estaba ahora probando la aplicación de Cupon.
Esto es lo único que he encontrado en el profiler por si puede servir de ayuda. En el apartado Mapping aparece esto:
Cupon\UsuarioBundle\Entity\Usuario The association Cupon\UsuarioBundle\Entity\Usuario#ciudad refers to the inverse side field Cupon\CiudadBundle\Entity\Ciudad#usuarios which does not exist.
En el dev.log
aparece esto, justo al intentar logearme con un email que no existe:
[2015-08-31 08:45:27] request.INFO: Matched route "usuario_login_check" (parameters: "_locale": "es", "_route": "usuario_login_check") [] [] [2015-08-31 08:45:27] doctrine.DEBUG: SELECT t0.id AS id1, t0.nombre AS nombre2, t0.apellidos AS apellidos3, t0.email AS email4, t0.password AS password5, t0.salt AS salt6, t0.direccion AS direccion7, t0.permite_email AS permite_email8, t0.fecha_alta AS fecha_alta9, t0.fecha_nacimiento AS fecha_nacimiento10, t0.dni AS dni11, t0.numero_tarjeta AS numero_tarjeta12, t0.ciudad_id AS ciudad_id13 FROM Usuario t0 WHERE t0.email = ? LIMIT 1 ["[email protected]"] []
No se si esto puede dar alguna pista...,
Gracias de nuevo Javier!
@vicfebo
Estoy utilizando en todo momento en el navegador el host http://127.0.0.1//... ¿Imagino que esto no tendrá nada que ver no? No he configurado el host para que sea cupon.local...
@vicfebo
El host local que tengas definido no debería influir. En mi caso, esto es lo que pasa cuando introduzco un usuario que no existe:
Y en el log veo lo siguiente:
[2015-08-31 11:02:59] request.INFO: Matched route "usuario_login_check" (parameters: "_locale": "es", "_route": "usuario_login_check") [] [] [2015-08-31 11:02:59] doctrine.DEBUG: SELECT ... FROM Usuario t0 WHERE t0.email = ? LIMIT 1 ["no_existe@sdfsfd"] [] [2015-08-31 11:02:59] security.INFO: Authentication request failed: Bad credentials [] [] [2015-08-31 11:02:59] security.DEBUG: Redirecting to usuario_login [] []
@javiereguiluz
Hola de nuevo,
En mi caso ni si quiera llega a aparecerme el security.INFO: Authentication request failed: Bad credentials. ¿Cómo podría depurar esa llamada y ver porque no está procesando los datos de user y pass? Es que me parece muy raro que esto solo pase cuando el user no existe.
¿Tal vez tendría que modificar algo en el fichero de security? No lo he tocado, está tal cual lo descargué.
Gracias!
@vicfebo
No se me ocurre qué puede estar pasando. He estado buscando un poco por StackOverflow y tampoco encuentro nada. A ver si a alguien de los que nos leen se le ocurre cuál puede ser el problema.
@javiereguiluz
¿Sabes como se llama el fichero de symfony que se encarga de procesar el login? El que lanza la query de autenticación....quizá si pudiera localizarlo y lanzar alguna traza...
Gracias de nuevo,
@vicfebo
Debería ser UsernamePasswordFormAuthenticationListener
, que se define aquí.
@javiereguiluz
Hola Javier,
He descubierto donde se produce el "crash" de la ejecución. En el fichero: vendor/Symfony/Symfony/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php en el método loadUserByUsername()
línea 52:
if (null === $user) { throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username)); }
Por lo visto cada vez que intenta lanzar la excepción de Usuario no encontrado, se cuelga la ejecución.
¿Hay que modificar algo de la configuración de Apache o Symfony para permitir este tipo de excepciones? Parece que también fallan el resto de throw new...
en otras funciones. Es muy raro.
Gracias por la ayuda,
@vicfebo
¿Es posible que tengas alguna extensión en el navegador o algún módulo o configuración en el servidor web que capture las excepciones de alguna manera? La excepción no es más que una respuesta con un código de estado HTTP diferente de 200. Así que a lo mejor tienes alguna extensión o módulo que captura esas respuestas para intentar mostrar información relacionada o ayuda sobre cómo solucionarla ... y se atasca por ser una aplicación interna que no se puede acceder desde Internet.
Puedes probar a lanzar en cualquier controlador un throw $this->createNotFoundException();
a ver qué pasa.
@javiereguiluz
Qué raro, acabo de probar lo que me comentas y si que me ha mostrado la página de NOT FOUND correctamente... Seguiré investigando a ver si consigo hacer funcionar la aplicación. Si me entero de algo lo comentaré por aquí.
¡Muchas gracias por la ayuda Javier! Saludos,
@vicfebo