ruby-on-rails session devise session-timeout

ruby on rails - Idea pierde sesión después del despliegue



ruby-on-rails session (3)

Tengo una aplicación Rails 4 en la que estoy usando el dispositivo para la autenticación y funciona perfectamente. Mi único problema es que pierde la sesión de un usuario después de que lo despliegue en el servidor y los usuarios tengan que volver a iniciar sesión.

Si solo hago un reinicio de nginx / passenger (que estoy usando para mi aplicación), no lo pierde. Cuando despliegue mi aplicación, la estoy perdiendo. Para la implementación, también borro automáticamente toda la base de datos y mi script de implementación ejecuta el archivo de semillas que también genera a los usuarios.

Actualmente estamos desarrollando la aplicación, por lo que este tipo de comportamiento es aceptable por ahora, pero en el futuro, cuando la aplicación esté lista, no lo haremos de esta manera (¡por supuesto!).

Entonces, ¿esto es un problema debido a la resiembra o debo verificar algo más? Veo que la contraseña cifrada cambia cada vez que ejecuto la acción de borrado / inicialización, ¿tiene esto que ver con la pérdida de la sesión del usuario?


Si solo hago un reinicio de nginx / passenger (que estoy usando para mi aplicación), no lo pierde. Cuando despliegue mi aplicación, la estoy perdiendo. Para la implementación, también borro automáticamente toda la base de datos y mi script de implementación ejecuta el archivo de semillas que también genera a los usuarios.

Si genera nuevos usuarios, los antiguos perderán sus sesiones.

Esto se debe a que los valores de los nuevos usuarios serán diferentes. Por ejemplo, es posible que no tengan un conjunto de token de recuerdo, o si session_id usa los valores de user.created_at o user.token_generated_at , serán diferentes cada vez que suelte y user.token_generated_at crear su base de datos.


La razón de este comportamiento es la siguiente:

Cada vez que un usuario cambie su contraseña, diseñe automáticamente la firma de él.

Entonces, básicamente al resembrar los datos, se vuelve a calcular la contraseña (aunque la contraseña sea la misma, la nueva contraseña encriptada es diferente de la anterior). Por lo tanto, el dispositivo firmará automáticamente al usuario, ya que parece que la contraseña ha cambiado (según el campo de contraseña cifrada).

Logré omitir este comportamiento, configurando específicamente la contraseña cifrada en el archivo seeds.rb y eludiendo la validación.


Nunca debe borrar una base de datos durante la implementación. Imagine que su aplicación se está ejecutando y tiene cientos de usuarios. Ahora realiza algunos cambios en el código y realiza una implementación. ¡POOF todos tus datos y usuarios se han ido! Ciertamente, esto no es lo que quieres.

En segundo lugar, los usuarios que se desconecten cuando borre la base de datos podrían deberse a uno de los siguientes motivos:

  • ¿Está generando usuarios con la misma ID? Si el ID de usuario cambia cuando vuelve a inicializar, provocará que los usuarios cierren la sesión

  • ¿Está almacenando sesiones en la base de datos usando config.session_store :active_record_store lugar de usar cookies? En este caso, borrar la base de datos eliminará la tabla de sesiones y cerrará la sesión a todos los usuarios

  • Rails 4 usa una tienda de cookies cifrada de forma predeterminada. Asegúrate de que no estás cambiando config.secret_token tu aplicación al volver a implementar, en caso de que se cargue desde la base de datos

En última instancia, eliminar la base de datos es la única razón por la que los usuarios se desconectan, y esa es una mala práctica. Entonces, lo más importante para solucionar es no borrar los datos durante las implementaciones .