rails pagina ejemplos crear con ruby-on-rails ruby-on-rails-3 session activerecord

ruby-on-rails - ejemplos - crear pagina web con ruby on rails



Configurar el tiempo de espera de la sesiĆ³n en Rails 3 (6)

Esto parece simple: estoy tratando de hacer que mi sesión de Active Record de los rieles 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 rieles desde la versión 2.3. Encontré el código relevante here . 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, }


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


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.


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

def timeout_in 2.minutes end


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.