Hola a tod@s, tengo la siguiente duda...
¿Luego de autenticarse y autorizarse los datos en una aplicación Silex se puede actualizar los datos del usuario? Mejor, ¿cómo lo hago en el proveedor Security?
El problema es: al ingresar a la aplicación se ingresa con el email o el usuario. Pero, si tengo un módulo de actualización de los datos del perfil del usuario y modifico este dato, la aplicación me bota fuera del firewall ya que, supongo, el primer dato no se parece al que se está actualizando... y la aplicación no lo reconoce, porque el anterior dato no se encuentra en la base de datos.
Quedo atento.
Saludos
Respuestas
Cuando un usuario está correctamente logueado y autenticado en la aplicación Silex, dentro de tu código puedes hacer uso del token que te proporciona el proveedor de seguridad para acceder al usuario:
$token = $app['security']->getToken(); if (null !== $token) { $usuario = $token->getUser(); }
Ahora, si actualizas la información del usuario independientemente del token, todo debería funcionar bien. Si por ejemplo actualizas el email del usuario, ejecutarías una sentencia SQL para actualizar ese dato de la tabla de usuarios, pero eso no le afectaría al token existente.
Para evitar problemas, cuando el usuario cambie un dato sensible como su email o su login, deberías desconectarle de la aplicación para forzar a que vuelva a hacer login.
@javiereguiluz
Gracias Javier por la respuesta. Y entiendo la cuestión de la seguridad... Pero creo que botar fuera de la aplicación al usuario al actualizar los datos del perfil, en este caso el email y/o usuario, no ayudaría mucho a la experiencia que se tiene de la aplicación.
Mi duda persiste en si este dato sensible, el email y/o usuario, se puede reemplazar por el id único de cada fila... y que este id único sea el valor con que se autentica y se autoriza... o que este dato se actualice al momento de actualizar los datos en la base de datos y así no sea botado el usuario fuera de la aplicación.
Con el password no pasa lo mismo. Éste se puede actualizar desde la aplicación, desde un módulo de perfil, y la aplicación sigue funcionando.
@cristian_angulo
Creo que me he explicado mal. Como tú mismo dices, desconectar a un usuario porque actualice su email o nombre de usuario es ridículo. Lo que te comentaba es que si ese email o ese nombre de usuario es el login de la aplicación, entonces sí que podrías hacer eso. De hecho, es muy común que las aplicaciones web ni siquiera te dejen cambiar tu login.
En cualquier caso, creo que este problema se podría resolver de manera más sencilla. Después de que el usuario cambie sus datos, puedes crear un nuevo token de seguridad para reemplazar al existente. Así que si cambia el login o la contraseña, ejecuta este código:
use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; $usuario = new User($username, $password, array('ROLE_USER')); $app['security']->setToken(new UsernamePasswordToken( $usuario, $usuario->getPassword(), 'nombre_del_firewall', array('ROLE_USER') ));
@javiereguiluz
Gracias. ¡Sí que me me sirvió!
@cristian_angulo