Configurar el tiempo de espera de la sesión en Rails 3

Esto parece simple: estoy tratando de hacer que mi sesión de Active Record de los Rails agote el tiempo de espera después de 2 minutos. Entonces, después de dos minutos, quiero que mis usuarios tengan que volver a iniciar sesión.

Solo estoy ejecutando el rails server (es decir, WebBrick) en mi máquina de desarrollo local.

Sé que esto tiene algo que ver con el siguiente código en config/initalizers/session_store.rb , pero no creo haberlo descifrado del todo:

 CodedOn::Application.config.session_store :active_record_store CodedOn::Application.configure do config.action_controller.session = {:expire_after => 2.minutes} end 

Esto no parece funcionar, o al menos mi sesión no parece agotar el tiempo de espera. No puedo encontrar mucho sobre la forma en que Rails 3 hace esto, ya que sé que las cosas han cambiado desde Rails 2.x.

¿Alguien me puede ayudar?

Creo que tendrá que hacer esto manualmente ya que el almacén de registros activo no implementa la opción expire_after. Entonces, dentro de su (supongo) antes del filtro, debe hacer esto:

 def authenticate if session[:logged_in] reset_session if session[:last_seen] < 2.minutes.ago session[:last_seen] = Time.now else ... authenticate session[:last_seen] = Time.now end end 

Obviamente, esto no es completo, pero debería darle la idea básica.

ACTUALIZAR :

Parece que la funcionalidad está presente en los Rails desde la versión 2.3. Encontré el código relevante aquí . Esto es AbstractStore que debería servir como clase base para todos los derivados. Entonces, como sugiere dadooda, lo siguiente debería funcionar:

 Some::Application.config.session_store :active_record_store, { expire_after: 24.hours, } 

Hice esto de manera simple, puedes probar esto:

En su config/initializers/session_store.rb simplemente haga esto:

 Yourapp::Application.config.session_store :cookie_store, :key => "_yourapp_session", :expire_after => 2.minutes 

Esto está funcionando bien para mí, la esperanza también funciona para ti.

Tienes que hacerlo de forma manual. Aquí hay un ejemplo de cómo crear un método de clase para las sesiones de ActiveRecord. Puede usar Rufus-Scheduler y / o DelayedJob para llamar esto regularmente.

 class Session < ActiveRecord::Base def self.sweep(time = 1.hour) if time.is_a?(String) time = time.split.inject { |count, unit| count.to_i.send(unit) } end delete_all "updated_at < '#{time.ago.to_s(:db)}' OR created_at < '#{2.days.ago.to_s(:db)}'" end end 

Más antecedentes sobre por qué es importante: http://guides.rubyonrails.org/security.html#session-expiry

mosch dice:

Creo que tendrá que hacer esto manualmente ya que el almacén de registros activo no implementa la opción expire_after.

Parece que ya no es así. :expire_after funcionó para mí en Rails 3.2.11:

 Some::Application.config.session_store :active_record_store, { key: "some_session_id", domain: ".isp.com", expire_after: 24.hours, } 

La cookie se prolonga automáticamente después de cada solicitud hacia la aplicación. La sesión persiste a través de las salidas del navegador.

Hice el truco anterior para “globalizar” la sesión en el dominio para una funcionalidad simple de SSO, parece funcionar hasta ahora.

El tiempo de vencimiento.

 MAX_SESSION_TIME = 60 * 60 before_filter :prepare_session def prepare_session if !session[:expiry_time].nil? and session[:expiry_time] < Time.now # Session has expired. Clear the current session. reset_session end # Assign a new expiry time, whether the session has expired or not. session[:expiry_time] = MAX_SESSION_TIME.seconds.from_now return true end 

Simplemente agregue el método timeout_in en su modelo y debería hacer el truco:

   def timeout_in
     2 minutos
   fin