Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Actualizar la información de un usuario autenticado en una aplicación Silex

29 de octubre de 2014

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

#1

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

29 octubre 2014, 8:25
#2

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

31 octubre 2014, 5:04
#3

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

31 octubre 2014, 8:18
#4

Gracias. ¡Sí que me me sirvió!

@cristian_angulo

2 febrero 2015, 18:54