Según tengo entendido, cuando el usuario inicia sesión correctamente, Symfony conservará una copia del documento/entidad del User en session.handler.native_file o en un proveedor de base de datos, lo que esté configurado. En solicitudes futuras, esta información se recuperará con la identificación de sesión guardada en la cookie.
Mi problema es que cada vez que un usuario actualiza su contraseña o nombre de usuario (que es su correo electrónico), las sesiones abiertas previamente en diferentes computadoras o navegadores no caducan o se configuran como no válidas.
Se supone que EquatableInterface debe verificar esto, pero realmente no funciona para mí. Como agregué el siguiente código auxiliar a la clase User :
#User.php public function isEqualTo(UserInterface $user) { return false; } Seguido de una actualización en el navegador, nada cambió. Mi sesión aún era válida y al verificar la búsqueda del User con un dump($this->getUser()) me dio el User actualizado actualmente y no el que estaba almacenado al comienzo de la sesión.
Intenté usar:
#security.yml security: always_authenticate_before_granting: trueSi haría algo, pero realmente no funcionó.
Usando Symfony Profiler , veo que un User ha sido obtenido de la base de datos cada vez que hago una solicitud y me pregunto si es en este punto que UserProviderInterface acaba de actualizar al usuario en security.token_storage en lugar de verificar primero los cambios en terminar la sesión si es necesario.
Para asegurarme de que esto sucedía, probé este controlador en dos navegadores diferentes:
#SomeController.php public function indexAction() { $encoder = $this->get('security.password_encoder'); $user = $this->getUser(); $flag = $encoder->isPasswordValid($user, 'MY_NEW_PASSWORD'); dump($flag); return []; } Inicié sesión en mi aplicación en ambos navegadores, luego cerré sesión en el navegador A. Cambié la contraseña de User a 'MY_NEW_PASSWORD' y simplemente actualicé el navegador B. El volcado fue true para la nueva contraseña.
Si este es el caso, me pregunto: - ¿Hay alguna forma de realizar una verificación en la base de datos antes de otorgar la autorización cuando el User se ha obtenido de security.token_storage ? (Supongo que sería un servicio que se ejecuta en el evento de búsqueda).
o tal vez estoy complicando demasiado las cosas y hay una solución súper simple que simplemente no he descubierto =|