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 sí :
# 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