rails docs auth ruby-on-rails ruby rest restful-authentication

ruby on rails - docs - Problema de secuestro de sesión inadvertido con autenticación reposada



rails 5 api authentication (3)

Esto puede suceder si usted (o los que escribieron restful_authentication) están almacenando en caché al usuario actual en una variable de clase. He visto un montón de artículos que defienden el uso de " User.current_user ", pero como las clases se almacenan en caché en las solicitudes, esto puede provocar una contaminación de la sesión.

Estoy usando la versión actual de restful_authentication que se encuentra en github y estoy teniendo un montón de problemas de sesión extraños. El servidor parece estar de alguna manera asignando sesiones a usuarios que no debería ser. Esto solo ocurre cuando se cruza la barrera de sesión / sesión iniciada.

Aquí hay un ejemplo. Sin sesiones activas en el servidor, inicio sesión en una cuenta con el usuario A. En otra máquina, inicio sesión con el usuario B. Luego, cuando cierre la sesión del usuario B, en algún momento después de que se cierre el redireccionamiento, iniciaré sesión como usuario A. Desde este punto, puedo seguir navegando por el sitio como si hubiera iniciado sesión como ese usuario. Algo que he observado a través de los registros es que cuando ocurre este secuestro, los ID de sesión no son los mismos. El usuario A está conectado en ambas sesiones, pero los ID de la sesión son completamente diferentes. Este es solo un ejemplo de lo que podría pasar. No puedo reproducir el problema de manera confiable ya que aparentemente es aleatorio.

No parece ser un síntoma del entorno o del servidor en el que se está ejecutando. Puedo reproducir el problema usando mestizo y pasajero. También lo he visto en desarrollo y producción. Estoy usando sesiones basadas en db en esta aplicación y se está ejecutando en Rails 2.1.1. Apliqué la opción stateful cuando llamo al generador. De lo contrario, no se han realizado otras modificaciones a la forma en que se manejan las sesiones.

Actualizar Aquí está el método ofensivo que vino directamente de restful_authentication.

# Accesses the current user from the session. # Future calls avoid the database because nil is not equal to false. def current_user @current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false end


¿Este sitio es remoto? ¿Estás iniciando sesión en dos computadoras separadas en la misma red?


No sé si esta es una gran respuesta, ya que es una solución alternativa. Todo lo que hice fue cambiar a sesiones basadas en cookies y todo está funcionando sin problemas.