web-dev-qa-db-ja.com

Rails 3でセッションタイムアウトを設定する

これは簡単に思えます:Rails Active Recordセッションを2分後にタイムアウトにしようとしています。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.

誰か助けてもらえますか?

45
Ciaran Archer

アクティブなレコードストアには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 [〜#〜]

機能IS Railsバージョン2.3以降。存在するコードを見つけました here 。これはAbstractStoreです。すべての派生クラスの基本クラスとして機能するため、dadoodaが示唆するように、次のように機能します。

Some::Application.config.session_store :active_record_store, {
  expire_after: 24.hours,
}
46
moritz

私はあなたがこれを試すことができる簡単な方法でこれをしました:

あなたのconfig/initializers/session_store.rbちょうどこれを行う:

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

これは私のためにうまく機能しています、希望もあなたのために働いています。

41
Ravindra

手動で行う必要があります。 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
m33lky

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は、アプリへのリクエストごとに自動的に延長されます。セッションは、ブラウザの終了後も持続します。

単純なSSO機能のために、ドメイン全体でセッションを「グローバル化」するために上記のトリックを実行しましたが、これまでのところうまくいくようです。

4
Alex Fortuna

有効期限。

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
regmiprem