Установка времени ожидания сессии в Rails 3 - PullRequest
45 голосов
/ 02 мая 2011

Это кажется простым: я пытаюсь перевести сеанс Active Record на мои рельсы через 2 минуты.Поэтому через две минуты я хочу, чтобы мои пользователи должны были повторно войти в систему.

Я просто запускаю rails server (т.е. WebBrick) на моей локальной машине разработчика.

Я знаю, что это как-то связано со следующим кодом в 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.

Может кто-нибудь мне помочь?

Ответы [ 6 ]

46 голосов
/ 02 мая 2011

Я думаю, вам придется сделать это вручную, поскольку в активном хранилище записей не реализована опция 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

Очевидно, это не завершено, но оно должно дать вам основную идею.

ОБНОВЛЕНИЕ:

Кажется, что функциональность присутствует в рельсах с версии 2.3.Я нашел соответствующий код здесь .Это AbstractStore, который должен служить базовым классом для всех производных.Итак, как предлагает Дадуда, должно работать следующее:

Some::Application.config.session_store :active_record_store, {
  expire_after: 24.hours,
}
40 голосов
/ 18 августа 2012

Я сделал это простым способом, вы можете попробовать это:

В вашем config/initializers/session_store.rb просто сделайте это:

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

Это работает для меня отлично, надежда работает для вас также.

4 голосов
/ 12 января 2013

Мош говорит:

Я думаю, вам придется сделать это вручную, поскольку в активном хранилище записей не реализована опция 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 автоматически продлевается после каждого запроса к приложению. Сеанс сохраняется через выходы браузера.

Я проделал описанный выше трюк, чтобы «глобализировать» сеанс через домен для простой функциональности единого входа, похоже, пока работает.

4 голосов
/ 27 января 2012

Вы должны сделать это вручную.Вот пример создания метода класса для сеансов 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

2 голосов
/ 30 мая 2012

Срок годности.

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
0 голосов
/ 09 марта 2014

Просто добавьте метод timeout_in в вашу модель, и он должен добиться цели:

  def timeout_in
    2.minutes
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...