Установка таймаута сеанса в Rails 3
Это кажется простым: я пытаюсь настроить сеанс Active Record на рельсы на таймаут через 2 минуты. Поэтому через две минуты я хочу, чтобы мои пользователи должны были повторно войти в систему.
Я просто запускаю rails server
(т.е. WebBrick) на своей локальной машине dev.
Я знаю, что это связано с следующим кодом в config/initalizers/session_store.rb
, но я не думаю, что я его прибил:
CodedOn::Application.config.session_store :active_record_store
CodedOn::Application.configure do
config.action_controller.session = {:expire_after => 2.minutes}
end
Это не работает, или, по крайней мере, мой сеанс не отображается на время ожидания. Я не могу много узнать о способе Rails 3 для этого, поскольку я знаю, что вещи изменились с Rails 2.x.
Может кто-нибудь мне помочь?
Ответы
Ответ 1
Я думаю, вам придется делать это вручную, так как в активном хранилище записей не используется опция expire_after. Поэтому в рамках вашего (я предполагаю) перед фильтром вы должны сделать это:
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
Очевидно, что это не полно, но это должно дать вам основную идею.
UPDATE
Кажется, что функциональность присутствует в рельсах с версии 2.3. Я нашел соответствующий код здесь. Это AbstractStore, который должен служить базовым классом для всех производных. Итак, как предполагает dadooda, следующее должно работать:
Some::Application.config.session_store :active_record_store, {
expire_after: 24.hours,
}
Ответ 2
Я сделал это простым способом, вы можете попробовать следующее:
В вашем config/initializers/session_store.rb
просто выполните следующее:
Yourapp::Application.config.session_store :cookie_store,
:key => "_yourapp_session",
:expire_after => 2.minutes
Это работает для меня точно, надежда работает и на вас.
Ответ 3
Вам нужно сделать это вручную. Здесь приведен пример создания метода класса для сеансов ActiveRecord. Вы можете использовать Rufus-Scheduler и/или DelayedJob, чтобы регулярно называть это.
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
Дополнительные сведения о том, почему это важно: http://guides.rubyonrails.org/security.html#session-expiry
Ответ 4
mosch говорит:
Я думаю, вам придется делать это вручную, так как в активном хранилище записей не используется опция expire_after.
Кажется, это уже не так. :expire_after
работал у меня в Rails 3.2.11:
Some::Application.config.session_store :active_record_store, {
key: "some_session_id",
domain: ".isp.com",
expire_after: 24.hours,
}
Автоматическое продление файла cookie после каждого запроса на приложение. Сеанс сохраняется через выходы браузера.
Я сделал вышеупомянутый трюк, чтобы "глобализовать" сеанс в домене для простой функции единого входа, похоже, работает до сих пор.
Ответ 5
Время истечения срока действия.
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
Ответ 6
Просто добавьте метод timeout_in в свою модель, и он должен сделать трюк:
def timeout_in
2.minutes
end