2009-08-07 16 views
11

A menudo quiero borrar el almacén de sesiones en Rails, en particular, el almacén de sesiones predeterminado basado en cookies. Algunos sitios parecen sugerir queComando para borrar el almacén de sesiones basado en cookies en Rails

rake tmp:sessions:clear 

lleva a cabo esta tarea, pero parece que no es así. ¿Cuál es la forma correcta de limpiar la tienda de sesiones basada en cookies?

Respuesta

8

El problema es que las cookies son del lado del cliente. Ejecutar una tarea de rake en su servidor no borrará las cookies en todas las máquinas que han visitado la página web, obviamente.

¿Quizás pueda usar session.clear en sus controladores de alguna manera? Sin embargo, tienes razón en cambiar la clave de la cookie. Hacerlo invalidaría cualquier sesión perteneciente a la clave anterior. Tendría que rescatar de ActionController::StaleSession (o algo así), pero funcionaría.

+2

Correcto, como mencioné en mi comentario, tenía la impresión equivocada de que la cookie solo mantiene algún tipo de token de sesión entre el cliente y el servidor, y el token también se almacena en el servidor para validar el token del cliente o los datos están en el lado del servidor. Temporalmente, tengo una solución en mi código para ignorar la sesión. Quizás lo más fácil es cambiar a una tienda de cookies respaldada por datos para el entorno de desarrollo (quiero borrar las sesiones solo para fines de desarrollo). – user85509

3

Se me ocurre ahora que lo que deseo puede no ser posible dependiendo de cómo se implemente la tienda basada en cookies. Si las cookies contienen toda la información que el servidor necesita (incluida una firma para la integridad de los datos), entonces el servidor no necesita almacenar ninguna información de su lado, por lo tanto, no hay forma de invalidar las cookies existentes. Supuse que la cookie contenía alguna clave que correspondía a los datos del lado del servidor para verificar que la cookie es válida, pero ahora me doy cuenta de que puede no ser el caso.

Si esto es cierto, entonces la única forma de borrar las cookies sería cambiar el secreto de cookies del lado del servidor utilizado para la firma y luego, presumiblemente, reiniciar el proceso del servidor.

+0

Cambió config.secret_token y reinició el servidor. Las sesiones de cookies se restablecieron. Resultado. – patrickmcgraw

9

Cambia el nombre de la cookie de sesión. No eliminará las cookies antiguas, pero obligará a todos a obtener una nueva cookie de sesión.

24

Si utiliza sesiones basadas en cookies

Puede cambiar el secret_token de su aplicación rieles. Esto invalidará todas las sesiones existentes.

rake secret 

luego copiar el valor a

RAILS_ROOT/config/initializers/session_store.rb 

Eso es todo. Recuerde que debe reiniciar su aplicación después de esto;)

Si utiliza sesiones basadas en bases de datos

rake db:sessions:clear 

Si utiliza sesiones basadas en archivos

rake tmp:sessions:clear 
+4

Tuve que copiar el valor a secret_token.rb –

1

Si está ejecutando esto en una servidor de producción que recomiendo:

rake secret 

que simplemente genera un token seguro aleatorio. La tarea de rake es básicamente hacer esto, lo que puedes hacer en una consola.

SecureRandom.hex(64) 

Nunca compruebe la clave de producción en el control de versiones/GIT, pero utilice una variable de entorno en su lugar.Por lo tanto, en su archivo config/secrets.yml utilice algo como:

production: 
    secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 
Cuestiones relacionadas