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.