Pregunta

La aplicación My Rails tiene un cuadro de inicio de sesión con una casilla de verificación "recordarme".Los usuarios que marquen esa casilla deben permanecer conectados incluso después de cerrar su navegador.Hago un seguimiento de si los usuarios han iniciado sesión almacenando 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 ellos persistentes:

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 cual resulta sorprendente para una funcionalidad tan común.¿Hay alguna forma mejor?

Editar

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

¿Fue útil?

Solución

Pasé un tiempo pensando en esto y llegué a algunas conclusiones.Las cookies de sesión de Rails son a prueba de manipulaciones de forma predeterminada, por lo que realmente no tiene que preocuparse de que se modifique una cookie en el lado del cliente.

Esto es lo que he hecho:

  • La cookie de sesión está configurada para ser de larga duración (6 meses aproximadamente)
  • Dentro de la tienda de sesiones
    • Una fecha de 'expira el' que está configurada para iniciar sesión + 24 horas
    • identificación de usuario
    • Autenticado = verdadero para poder permitir sesiones de usuarios anónimos (no es peligroso debido a la protección contra manipulación de cookies)
  • Agrego un before_filter en el controlador de aplicación que verifica la parte de la sesión que 'expide'.

Cuando el usuario marca la casilla "Recordarme", simplemente configuro la fecha de sesión[:expireson] para que sea inicio de 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 Rails es a prueba de manipulaciones.

Otros consejos

Es casi seguro que no debería extender la cookie de sesión para que dure mucho tiempo.

Aunque no se trata específicamente de rieles Este artículo se extiende con cierta extensión para explicar las mejores prácticas de "recuérdame".

En resumen, deberías:

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

El autor también recomienda invalidar el valor aleatorio y restablecer la cookie cada vez que inicie sesión.Personalmente, no me gusta eso, ya que entonces no puedes permanecer conectado a un sitio en dos computadoras.Yo tendería a asegurarme de que mi función de cambio de contraseña también restableciera el valor aleatorio, bloqueando así sesiones en otras máquinas.

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

Le 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 complemento RESTful Authentication_plugin.Hay una buena explicación sobre cómo usar este complemento en Railscasts:

Railscasts # 67 autenticación_restful

Aquí hay un enlace al complemento en sí.

autenticación_restful

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

http://agilewebdevelopment.com/plugins/restful_authentication

Tenga en cuenta que no desea conservar su sesión, solo su identidad.Creará una nueva sesión para ellos cuando regresen a su sitio.Por lo general, simplemente asigna un GUID al usuario, lo escribe en su cookie y luego lo usa para buscarlo cuando regresa.No utilice su nombre de inicio de sesión o ID de usuario para el token, ya que podría adivinarse fácilmente y permitir que visitantes astutos se apropien de las cuentas de otros usuarios.

Este es un artículo bastante bueno sobre la experiencia de un chico al crear sesiones persistentes de 30 días.

ADVERTENCIA:La publicación del blog es de 2006.

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

Esto funcionó de maravilla 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 de manera persistente durante otras dos semanas.

Básicamente, es tan simple como:

  1. incluyendo un archivo en el directorio proveedor/complementos
  2. establezca el valor de vencimiento de la sesión en el controlador de la aplicación usando solo una línea

Yo elegiría Devise como una brillante solución de autenticación para rieles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top