ruby-on-rails - gratis - ruby on rails tutorial
ImplementaciĆ³n de "Recordarme" en una aplicaciĆ³n Rails (8)
El complemento restful_authentication tiene una buena implementación de esto:
http://agilewebdevelopment.com/plugins/restful_authentication
Mi aplicación Rails 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. Llevo un registro 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 hacerlos 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 es sorprendente para una funcionalidad tan común. ¿Hay alguna forma mejor?
Editar
La respuesta de Gareth es bastante buena, pero todavía me gustaría una respuesta de alguien familiarizado con Rails 2 (debido a que es único
CookieSessionStore
).
Esta es una muy buena reseña de la experiencia de un chico de 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ó 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 de forma persistente durante otras dos semanas.
Básicamente, es tan simple como:
- incluyendo un archivo en el directorio de proveedores / complementos
- establecer el valor de vencimiento de la sesión en el controlador de la aplicación usando solo una línea
Iría por Devise para una brillante solución de autenticación para rieles.
Le sugiero que eche un vistazo al complemento RESTful_Authentication, que tiene una implementación de esto, o simplemente cambie su implementación para usar 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 complemento en sí
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 por la modificación de una cookie en el cliente.
Esto es lo que hice:
- La cookie de sesión está configurada para ser de larga duración (aproximadamente 6 meses)
-
Dentro de la tienda de sesiones
- Una fecha ''caduca el'' que se establece para iniciar sesión + 24 horas
- ID de usuario
- Authenticated = true para poder permitir sesiones de usuario anónimas (no es peligroso debido a la protección contra manipulaciones de cookies)
- Agrego un before_filter en el controlador de la aplicación que verifica la parte ''caduca en'' de la sesión.
Cuando el usuario marca la casilla "Recordarme", simplemente configuro la fecha de sesión [: expireson] para iniciar sesión + 2 semanas. Nadie puede robar la cookie y permanecer conectado para siempre o enmascararse como otro usuario porque la cookie de sesión de rails es a prueba de manipulaciones.
Seguramente no debería extender la cookie de sesión para que dure mucho.
Aunque no trata específicamente con los rieles, este artículo se esfuerza un poco para explicar las mejores prácticas de ''recordarme''.
En resumen, deberías:
- Agregue una columna adicional a la tabla de usuario para aceptar un valor aleatorio grande
- Establezca una cookie de larga duración en el cliente que combine la identificación de usuario y el valor aleatorio
- Cuando se inicia una nueva sesión, verifique la existencia de la cookie de id / value y autentique al nuevo usuario si coincide.
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 puedes permanecer conectado a un sitio en dos computadoras. Tendería a asegurarme de que mi función de cambio de contraseña también restableciera el valor aleatorio, bloqueando las sesiones en otras máquinas.
Como nota final, vale la pena seguir los consejos 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.
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. En general, solo asigna un GUID al usuario, lo escribe en su cookie y luego lo usa para buscarlo cuando vuelva. No use su nombre de usuario o ID de usuario para el token, ya que podría adivinarse fácilmente y permitir a los visitantes astutos secuestrar las cuentas de otros usuarios.