2010-02-04 5 views
5

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 Authlogic gem, 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.Ruby on Rails - Authlogic: compruebe periódicamente si la sesión del usuario es válida

<%= 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 

me di cuenta de que cada vez que llamo current_user el objeto de usuario se actualiza por lo que 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 current_user renew, actualice al usuario y la sesión nunca caduque.

alguna idea? Gracias

Respuesta

5

Desde el AuthLogic source itself:

# 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, que se quiere añadir el método para su controlador usando el nombre de su acción:

def last_request_update_allowed? 
    action_name != "check_session_timed_out" 
end 
+0

MERCI! Eso es perfecto – Mathieu

6

Authlogic puede hacer esto para ti. Sólo tiene que utilizar en sus modelos:

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 trabajar! = D