45 votes

Paramètre de délai d'expiration de session dans Rails 3

Cela semble simple: j'essaie d'obtenir mon rails Active Record session timeout au bout de 2 minutes. Ainsi, après deux minutes, je veux que mes utilisateurs à se connecter à nouveau.

Je suis juste en cours d'exécution rails server (c'est à dire WebBrick) sur mon dev local de la machine.

Je sais que c'est quelque chose à voir avec le code suivant en config/initalizers/session_store.rb, mais je ne pense pas que j'ai trouvé:

CodedOn::Application.config.session_store :active_record_store

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

Cela ne semble pas fonctionner, ou au moins ma session ne s'affiche pas de délai d'attente. Je ne trouve pas beaucoup sur les Rails de 3 façon de faire ce que je sais, les choses ont changé à partir de Rails 2.x.

Peut quelqu'un m'aider?

46voto

moritz Points 9491

Je pense que vous devrez le faire manuellement depuis l'active record store ne pas mettre en œuvre la expire_after option. Donc à l'intérieur de votre (je suppose) avant de filtre, vous devez faire ceci:

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

Évidemment, ce n'est pas complète, mais elle devrait vous donner l'idée de base.

Mise à JOUR:

Il semble que la fonctionnalité EST présente dans les rails depuis la version 2.3. J'ai trouvé le code ici. C'est AbstractStore qui devrait servir de classe de base pour tous les dérivés. Donc, comme dadooda l'indique, la suivante devrait fonctionner:

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

41voto

Ravindra Points 241

J'ai fait cela de manière simple, vous pouvez essayer ceci:

Dans votre config/initializers/session_store.rb faire ce:

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

Ce travail est pour moi finement, de l'espérance qui fonctionne pour vous aussi.

4voto

m33lky Points 1608

Vous devez le faire manuellement. Voici un exemple de création d'une méthode de classe pour ActiveRecord sessions. Vous pouvez utiliser Rufus-Planificateur et/ou DelayedJob régulièrement appel.

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

Plus d'informations sur pourquoi il est important: http://guides.rubyonrails.org/security.html#session-expiry

4voto

dadooda Points 506

mosch dit:

Je pense que vous devrez le faire manuellement depuis l'active record store ne pas mettre en œuvre la expire_after option.

Il semble qu'il n'est plus de cette manière. :expire_after a travaillé pour moi dans les Rails 3.2.11:

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

Le témoin auto-prolonge après chaque requête vers l'application. La session persiste à travers le navigateur se ferme.

J'ai fait l'astuce ci-dessus à "globaliser" la session travers de domaine pour une simple fonctionnalité d'authentification unique, semble fonctionner pour autant.

2voto

regmiprem Points 294

Le temps d'expiration.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X