Aquí podría ser tu PUBLICIDAD


Implementación de "Recordarme" en una aplicación de Rails

votos
46

My Rails-app tiene un cuadro de inicio de sesión con una casilla de verificación recordarme. Los usuarios que marcan esa casilla deben permanecer conectados incluso después de cerrar su navegador. Estoy manteniendo un registro de si los usuarios están conectados guardando su identificación en la sesión del usuario.

Pero las sesiones se implementan en Rails como cookies de sesión, que no son persistentes. Puedo hacer que ellos persistente:

class ApplicationController < ActionController::Base
  before_filter :update_session_expiration_date

  private

  def update_session_expiration_date
    options = ActionController::Base.session_options
    unless options[:session_expires]
      options[:session_expires] = 1.year.from_now
    end
  end
end

Pero eso parece un truco, lo que es sorprendente para una funcionalidad tan común. ¿Hay alguna forma mejor?

Editar

La respuesta de Gareth es bastante buena, pero aún me gustaría recibir una respuesta de alguien familiarizado con Rails 2 (porque es única CookieSessionStore).

Publicado el 02/08/2008 a las 13:56
fuente por usuario Michiel de Mare
En otros idiomas...        العربية       

8 respuestas

votos
26

Es casi seguro que no extenderás la cookie de sesión para que dure mucho.

Aunque no se trata específicamente de los rieles, este artículo explica con detalle las mejores prácticas de "recordarme".

En resumen, debes:

  • Agregue una columna adicional a la tabla de usuario para aceptar un gran valor aleatorio
  • Establezca una cookie de larga duración en el cliente que combine la identificación del usuario y el valor aleatorio
  • Cuando se inicia una nueva sesión, verifique la existencia de la cookie id / value y autentique al nuevo usuario si coinciden.

El autor también recomienda invalidar el valor aleatorio y restablecer la cookie en cada inicio de sesión. Personalmente, no me gusta, ya que no puede permanecer conectado a un sitio en dos computadoras. Tiendo a asegurarme de que mi función de cambio de contraseña también restablezca el valor aleatorio, bloqueando así las sesiones en otras máquinas.

Como nota final, vale la pena seguir el consejo que da sobre la posibilidad de hacer ciertas funciones (cambio de contraseña / cambio de correo electrónico, etc.) en sesiones autenticadas automáticamente, pero rara vez se ven en el mundo real.

Respondida el 02/08/2008 a las 05:10
fuente por usuario Gareth Simpson


Aquí podría ser tu PUBLICIDAD


votos
10

Pasé un tiempo pensando en esto y llegué a algunas conclusiones. Las cookies de la sesión de Rails son a prueba de manipulaciones por defecto, por lo que no tiene que preocuparse por la modificación de una cookie en el extremo del cliente.

Esto es lo que hice:

  • La cookie de sesión se configura para que dure mucho tiempo (aproximadamente 6 meses)
  • Dentro de la tienda de sesiones
    • Una fecha de 'caducidad' configurada para iniciar sesión + 24 horas
    • identidad de usuario
    • Authenticated = true, así que puedo permitir sessiones de usuario anónimas (no son peligrosas debido a la protección contra manipulación de cookies)
  • Agrego un before_filter en el controlador de la aplicación que verifica la parte 'expira en' de la sesión.

Cuando el usuario marca el recuadro "Recordarme", simplemente configuro la fecha de sesión [: expireson] para que inicie sesión + 2 semanas. Nadie puede robar la cookie y permanecer conectado para siempre o hacerse pasar por otro usuario porque la cookie de sesión de los rieles es inviolable.

Respondida el 16/09/2008 a las 10:37
fuente por usuario Daniel Beardsley

votos
9

Sugeriría que eche un vistazo al complemento RESTful_Authentication, que tiene una implementación de esto, o simplemente cambie su implementación para usar el RESTful Authentication_plugin. Hay una buena explicación sobre cómo usar este complemento en Railscasts:

Railscasts # 67 restful_authentication

Aquí hay un enlace al plugin en sí

restful_authentication

Respondida el 17/09/2008 a las 03:17
fuente por usuario Mattew

votos
5

El complemento restful_authentication tiene una buena implementación de esto:

http://agilewebdevelopment.com/plugins/restful_authentication

Respondida el 06/08/2008 a las 10:30
fuente por usuario Jarin Udom

votos
3

Yo iría por Idear una solución de autenticación brillante para rieles.

Respondida el 16/01/2011 a las 05:26
fuente por usuario Ved

votos
3

Tenga en cuenta que no desea mantener su sesión, solo su identidad. Creará una nueva sesión para ellos cuando regresen a su sitio. Generalmente, usted asigna un GUID al usuario, lo escribe en su cookie y luego lo usa para buscarlos cuando regresen. No use su nombre de usuario o ID de usuario para el token, ya que podría ser adivinado fácilmente y permitir a los visitantes astutos secuestrar las cuentas de otros usuarios.

Respondida el 01/09/2008 a las 10:46
fuente por usuario Teflon Ted

votos
3

Este es un buen resumen de la experiencia de uno de los chicos de crear sesiones persistentes de 30 días.

ADVERTENCIA: publicación de blog es de 2006

http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html

Respondida el 03/08/2008 a las 02:53
fuente por usuario engtech

votos
2

Esto funcionó como un encanto para mí:

http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/

Ahora mis sesiones de CookieStore caducan después de dos semanas, por lo que el usuario debe enviar sus credenciales de inicio de sesión nuevamente para poder iniciar sesión continuamente durante otras dos semanas.

Básicamente, es tan simple como:

  1. incluyendo un archivo en el directorio de proveedores / complementos
  2. establecer el valor de caducidad de la sesión en el controlador de la aplicación usando solo una línea
Respondida el 20/09/2008 a las 09:58
fuente por usuario Allan L.