Ustawianie limitu czasu sesji w Rails 3

To wydaje się proste: próbuję ustawić limit czasu sesji Rails Active Record po 2 minutach. Więc po dwóch minutach chcę, aby moi użytkownicy musieli ponownie się zalogować.

Uruchamiam rails server (tj. WebBrick) na mojej lokalnej maszynie dev.

Wiem, że to ma coś wspólnego z poniższym kodem w config/initalizers/session_store.rb, ale nie wydaje mi się, żebym to do końca zrozumiał:

CodedOn::Application.config.session_store :active_record_store

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

To chyba nie działa, albo przynajmniej moja sesja nie wydaje się timeout. Nie mogę znaleźć wiele o Rails 3 sposób na zrób to, jak wiem, rzeczy się zmieniły od Rails 2.x.

Czy ktoś może mi pomóc?
Author: Ciaran Archer, 2011-05-02

6 answers

Myślę, że będziesz musiał to zrobić ręcznie, ponieważ active record store nie implementuje opcji expire_after. Więc w Twoim (zakładam) przed filtrem powinieneś to zrobić:

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

Oczywiście, nie jest to kompletne, ale powinno dać ci podstawową ideę.

UPDATE :

Wygląda na to, że funkcjonalność jest obecna w rails od wersji 2.3. Znalazłem odpowiedni kod tutaj . Jest to AbstractStore, który powinien służyć jako klasa bazowa dla wszystkich pochodne. Tak więc, jak sugeruje dadooda, powinno działać:

Some::Application.config.session_store :active_record_store, {
  expire_after: 24.hours,
}
 46
Author: moritz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-13 15:51:53

Zrobiłem to w prosty sposób możesz spróbować tego:

W Twoim config/initializers/session_store.rb po prostu zrób to:

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

To działa dla mnie dobrze, nadzieja działa również dla Ciebie.

 37
Author: Ravindra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-18 06:30:16

Musisz to zrobić ręcznie. Oto przykład tworzenia metody klasowej dla sesji ActiveRecord. Możesz użyć Rufus-Scheduler i/lub DelayedJob, aby regularnie to wywoływać.

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

Więcej informacji o tym, dlaczego jest to ważne: http://guides.rubyonrails.org/security.html#session-expiry

 4
Author: m33lky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-28 01:52:27

Mosch says:

Myślę, że będziesz musiał to zrobić ręcznie, ponieważ active record store nie implementuje opcji expire_after.

Wygląda na to, że już tak nie jest. :expire_after u mnie działało w Rails 3.2.11:
Some::Application.config.session_store :active_record_store, {
  key: "some_session_id",
  domain: ".isp.com",
  expire_after: 24.hours,
}

Plik cookie automatycznie przedłuża się po każdym żądaniu skierowanym do aplikacji. Sesja jest kontynuowana przez wyjścia z przeglądarki.

Zrobiłem powyższą sztuczkę, aby "globalizować" sesję w całej domenie dla prostej funkcjonalności SSO, wydaje się działać tak daleko.

 4
Author: Alex Fortuna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 11:54:12

Czas ważności.

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
 2
Author: regmiprem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-20 15:31:51

Po prostu Dodaj metodę timeout_in do swojego modelu i powinna zadziałać:

  def timeout_in
    2.minutes
  end
 -4
Author: GG.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-09 19:56:50