Подтвердить что ты не робот

Установка таймаута сеанса в 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.

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

4b9b3361

Ответ 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