これは簡単に思えます: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.
誰か助けてもらえますか?
アクティブなレコードストアには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,
}
私はあなたがこれを試すことができる簡単な方法でこれをしました:
あなたのconfig/initializers/session_store.rb
ちょうどこれを行う:
Yourapp::Application.config.session_store :cookie_store,
:key => "_yourapp_session",
:expire_after => 2.minutes
これは私のためにうまく機能しています、希望もあなたのために働いています。
手動で行う必要があります。 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
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機能のために、ドメイン全体でセッションを「グローバル化」するために上記のトリックを実行しましたが、これまでのところうまくいくようです。
有効期限。
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