2010-02-04 7 views
5

Sto cercando una soluzione che mi consenta di controllare periodicamente se la sessione utente è scaduta e in tal caso reindirizzare la pagina di accesso.
Sto utilizzando la gemma di Authlogic, quindi quello che sto facendo è chiamare una funzione che esegue un test su current_user.
Il mio USER_SESSION_TIMEOUT è 5 minuti, quindi effettuo questa chiamata ajax ogni 5:10 minuti.Ruby on rails - Authlogic: controlla periodicamente se la sessione utente è valida

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

ho notato che ogni volta che io chiamo CURRENT_USER l'oggetto utente viene aggiornato e quindi la sessione si rinnova per 5 minuti.
Non c'è alcun problema quando viene aperta una sola scheda, ma se ho 2 schede ogni volta chiamo check_session_timed_out current_user rinnovo l'aggiornamento all'utente e quindi la sessione non scade mai.

qualche idea? Grazie

risposta

5

Dal 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 

Nel tuo caso, si vorrebbe aggiungere il metodo per il controllore utilizzando il nome della vostra azione:

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

MERCI! è perfetto – Mathieu

6

Authlogic può fare questo per te. Basta usare nei tuoi modelli:

Sul modello User:

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

... e dal modello UserSession:

self.logout_on_timeout = true 

E semplicemente lavorare! = D