tutorial sessions rails español ruby ruby-on-rails-3 session devise

sessions - Las sesiones se están cruzando. Ruby on Rails



devise wiki (2)

Tengo una aplicación que utiliza un dispositivo para la autenticación. Rieles 3 en ruby ​​1.9.2, con el pasajero en la parte superior de nginx.

Aquí está mi problema: he notado que, en ocasiones, mis sesiones se cruzan. Mientras estoy conectado como un usuario, a veces me convierto en otro usuario. Este es realmente un problema horrible. He logrado que se detenga mediante el uso del almacenamiento de sesiones active_record. Pero estoy perplejo en cuanto a dónde podría estar sucediendo. Ocurre tanto cuando se utiliza el almacenamiento de cookies como el almacenamiento de memcached. No estoy seguro de por dónde empezar a depurar. He revisado todo mi código, y solo leo de ''current_user'' que no estoy escribiendo. No tengo ningún código que almacene elementos en sesión.

¿Puede alguien darme sugerencias sobre dónde o cómo podría estar sucediendo esto?

Actualizar:

Configuré un div en la parte superior de la página para volcar el contenido de la sesión en cada solicitud. No es solo el cambio de usuario, es toda la sesión. Hay algunas variables ficticias que configuro en la sesión solo para ver qué sucedería. Cuando las sesiones se cruzan, (el usuario A se convierte en usuario B) el usuario A ahora ve las variables ficticias que tenía el usuario B. Y el usuario B está desconectado.

ACTUALIZACIÓN 2

Encontré otra pregunta aquí sobre el desbordamiento de pila que describe el mismo problema exacto: en Rails, ¿qué podría causar que un usuario tenga la sesión de otro usuario?

Parece que podría ser un problema de pasajeros? Pero más importante, ¿cómo es que incluso está sucediendo? Este es un gran problema REAL ¿Cómo puedo poner fin a esto?

ACTUALIZACIÓN 3

Ahora estoy usando Unicorn para servir mi aplicación. Yo configuro config.threadsafe! Y comencé a usar sesiones de registro activo exclusivamente. No más sesiones de memcached. El problema se ha ido. Al menos puedo dejar de quitarme el pelo porque el orificio de seguridad está tapado.

Todavía me gustaría saber qué fue exactamente lo que lo estaba causando. La mayoría de los tutoriales por ahí muestran cómo configurar el pasajero, con el método de generación predeterminado. Naturalmente, creo que memcached se desempeñaría mejor para la administración de sesiones en comparación con otros métodos. Especialmente en un entorno de servidor de múltiples aplicaciones.

Actualización 4

Bueno, última y última actualización. Este fue un problema con los procesos bifurcados que usan la misma conexión memcached. Lo arreglé utilizando el cliente de dalli memcached y restableciendo la conexión en la devolución de llamada after_fork de unicornio o pasajero.


Es muy probable que este error se pueda solucionar actualizando a rack-cache 1.2 o superior. Esto es lo que podría estar pasando:

  1. El usuario A solicita una página. Se crea una sesión y se devuelve un encabezado Set-Cookie en la respuesta.
  2. Rack-cache almacena incorrectamente el encabezado Set-Cookie con el ID de sesión del usuario A.
  3. El usuario B solicita la misma página y el caché de rack sirve la respuesta en caché, incluido el encabezado Set-Cookie con el ID de sesión del usuario A.

Estos dos tickets discuten este problema: https://github.com/rails/rails/issues/476 y https://github.com/rtomayko/rack-cache/pull/52

Finalmente, este problema se menciona en las notas de la versión para rack-cache 1.2: https://github.com/rtomayko/rack-cache/blob/master/CHANGES

También tenga en cuenta que, incluso cuando NO está utilizando el almacén de sesión de cookies, el ID de la sesión todavía se almacena en una cookie, por lo que este error podría seguir afectándole incluso cuando no esté utilizando el almacén de cookies.

Espero que esto ayude.

Johannes


Estaría dispuesto a apostar que está utilizando el engendro inteligente de Passenger (predeterminado) y ser víctima del Engendro Gotcha .

Establezca su Método de empeño de pasajero en "conservador" y vea si esto desaparece. Esto explica fácilmente el caso de memcache, a menos que esté protegiéndose contra él. Presumiblemente un problema similar en el diseño (o su código).

¿Ve sesiones cruzadas entre servidores físicos o solo en un servidor?