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?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,
}
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.
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
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:
Wygląda na to, że już tak nie jest.Myślę, że będziesz musiał to zrobić ręcznie, ponieważ active record store nie implementuje opcji expire_after.
: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.
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
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
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