2010-02-04 8 views
5

Je cherche une solution me permettant de vérifier périodiquement si la session de l'utilisateur a expiré et si c'est le cas, de le rediriger vers la page de connexion.
J'utilise Authlogic gem, donc ce que je fais c'est appeler une fonction qui fait un test sur current_user.
Mon USER_SESSION_TIMEOUT est de 5 minutes, donc je fais cet appel ajax toutes les 5:10 minutes.Ruby on rails - Authlogic: vérifie périodiquement si la session utilisateur est valide

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

Je remarqué que chaque fois que j'appelle current_user l'objet utilisateur est mis à jour et ainsi la session est renouvelée à 5 minutes.
Il n'y a pas de problème quand un seul onglet est ouvert mais si j'ai 2 onglets chaque fois que j'appelle check_session_timed_out current_user renouveler mettre à jour l'utilisateur et donc la session n'expire jamais.

une idée? Merci

Répondre

5

De l'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 

Dans votre cas, vous voulez ajouter la méthode à votre contrôleur en utilisant le nom de votre action:

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

MERCI! c'est parfait – Mathieu

6

Authlogic peut faire pour toi. Il suffit d'utiliser dans vos modèles:

Sur le modèle de l'utilisateur:

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

... et sur le modèle de UserSession:

self.logout_on_timeout = true 

Et tout simplement travailler! = D