Impostazione del timeout della sessione in Rails 3

Questo sembra semplice: sto cercando di ottenere il timeout della sessione Active Record delle mie binari dopo 2 minuti. Quindi, dopo due minuti, voglio che i miei utenti debbano effettuare nuovamente il login.

Sto solo facendo funzionare il rails server (ad esempio WebBrick) sulla mia macchina di sviluppo locale.

So che questo è qualcosa a che fare con il seguente codice in config/initalizers/session_store.rb , ma non penso di averlo abbastanza inchiodato:

 CodedOn::Application.config.session_store :active_record_store CodedOn::Application.configure do config.action_controller.session = {:expire_after => 2.minutes} end 

Questo non sembra funzionare, o almeno la mia sessione non sembra scadere. Non riesco a trovare molto sul modo Rails 3 per farlo, perché so che le cose sono cambiate da Rails 2.x.

Qualcuno mi può aiutare?

Penso che dovrai farlo manualmente poiché l’archivio di record attivo non implementa l’opzione expire_after. Quindi all’interno del tuo (presumo) prima del filtro, dovresti fare questo:

 def authenticate if session[:logged_in] reset_session if session[:last_seen] < 2.minutes.ago session[:last_seen] = Time.now else ... authenticate session[:last_seen] = Time.now end end 

Ovviamente, questo non è completo, ma dovrebbe darti l'idea di base.

AGGIORNAMENTO :

Sembra che la funzionalità sia presente nei binari dalla versione 2.3. Ho trovato il codice rilevante qui . Questo è AbstractStore che dovrebbe servire come class base per tutti quelli derivati. Quindi, come suggerisce papaura, il seguente dovrebbe funzionare:

 Some::Application.config.session_store :active_record_store, { expire_after: 24.hours, } 

L’ho fatto in modo semplice puoi provare questo:

Nella tua config/initializers/session_store.rb basta fare questo:

 Yourapp::Application.config.session_store :cookie_store, :key => "_yourapp_session", :expire_after => 2.minutes 

Funziona perfettamente per me, la speranza funziona anche per te.

Devi farlo manualmente. Ecco un esempio di creazione di un metodo di class per le sessioni di ActiveRecord. È ansible utilizzare Rufus-Scheduler e / o DelayedJob per chiamare regolarmente questo.

 class Session < ActiveRecord::Base def self.sweep(time = 1.hour) if time.is_a?(String) time = time.split.inject { |count, unit| count.to_i.send(unit) } end delete_all "updated_at < '#{time.ago.to_s(:db)}' OR created_at < '#{2.days.ago.to_s(:db)}'" end end 

Ulteriori informazioni sul perché è importante: http://guides.rubyonrails.org/security.html#session-expiry

Mosch dice:

Penso che dovrai farlo manualmente poiché l’archivio di record attivo non implementa l’opzione expire_after.

Sembra che non sia più così. :expire_after funzionato per me in Rails 3.2.11:

 Some::Application.config.session_store :active_record_store, { key: "some_session_id", domain: ".isp.com", expire_after: 24.hours, } 

Il cookie si auto-prolunga dopo ogni richiesta verso l’app. La sessione persiste attraverso le uscite del browser.

Ho fatto il trucco di cui sopra per “globalizzare” la sessione attraverso il dominio per una semplice funzionalità SSO, sembra funzionare finora.

Il tempo di scadenza

 MAX_SESSION_TIME = 60 * 60 before_filter :prepare_session def prepare_session if !session[:expiry_time].nil? and session[:expiry_time] < Time.now # Session has expired. Clear the current session. reset_session end # Assign a new expiry time, whether the session has expired or not. session[:expiry_time] = MAX_SESSION_TIME.seconds.from_now return true end 

Aggiungi il metodo timeout_in nel tuo modello e dovrebbe fare il trucco:

   def timeout_in
     2 minuti
   fine