rails gema current_user create ruby-on-rails session authlogic session-timeout

gema - Ruby on Rails-Authlogic: compruebe periódicamente si la sesión del usuario es válida



gema devise (2)

Estoy buscando una solución que me permita verificar periódicamente si la sesión del usuario ha expirado y, si es así, redirigirlo a la página de inicio de sesión.
Estoy usando la gema Authlogic, entonces lo que estoy haciendo es llamar a una función que haga una prueba en current_user.
Mi USER_SESSION_TIMEOUT es de 5 minutos, así que hago esta llamada ajax cada 5:10 minutos.

<%= periodically_call_remote :url => {:controller => ''user_session'', :action => ''check_session_timed_out''}, :frequency => (USER_SESSION_TIMEOUT + 10.seconds) %>

def check_session_timed_out if !current_user flash[:login_notice] = "Your session timed out due to a period of inactivity. Please sign in again." render :update do |page| page.redirect_to "/user_sessions/new" end else render :nothing => true end end

Noté que cada vez que llamo current_user el objeto de usuario se actualiza y la sesión se renueva a 5 minutos.
No hay problema cuando solo se abre una pestaña, pero si tengo 2 pestañas cada vez que llamo check_session_timed_out actual_user renew, actualice al usuario y la sesión nunca caduque.

¿alguna idea? Gracias


Desde la fuente de AuthLogic en :

# For example, what if you had a javascript function that polled the server # updating how much time is left in their session before it times out. Obviously # you would want to ignore this request, because then the user would never # time out. So you can do something like this in your controller: def last_request_update_allowed? action_name != "update_session_time_left" end

En su caso, le gustaría agregar el método a su controlador usando el nombre de su acción:

def last_request_update_allowed? action_name != "check_session_timed_out" end


Authlogic puede hacer esto por usted. Solo use en sus modelos:

En el modelo de Usuario:

acts_as_authentic do |c| c.logged_in_timeout(5.minutes) end

... y en el modelo UserSession:

self.logout_on_timeout = true

¡Y simplemente trabaja! = D