3

ここで別の方法でこの質問をしましたが、答えが得られなかったので、これは非常に単純な問題のように見えるので、言い換えてみます。

Cookie ベースのセッションを使用する Rails アプリがあります。デフォルトでは、expires_at タイムスタンプがないため、セッション Cookie のスコープは「セッション」です。これはバニラの Rails セッションのものです。

ここで、15 分後にユーザーを追い出す「デモ ユーザー」機能を作成したいと考えています。これを達成するために、Time.now + 15.minutes のセッション Cookie に expires_at を設定したいと考えています。

session[:expires_at] = Time.now + 15.minutes

上記のコードは実行されますが、Cookie のスコープには影響しません。スコープは「セッション」のままです。スコープを「セッション」から日時に変更するにはどうすればよいですか?

production.rb でアプリケーション全体のセッションを構成すると、

:expire_after => 24時間

その後、動作します...しかし、問題は、セッション Cookie の有効期限を選択的に制御したいということです。

編集: session[:expires_at] を設定したときに Cookie のスコープに影響がない理由は、後続のリクエストがセッション Cookie を破壊し、それをセッションにリセットしているためです。それについて何をすべきかまだわかりません。

4

2 に答える 2

2

おそらく、Cookie の有効期限に依存する代わりに ( 「Ruby On Rails セキュリティ ガイド」のセクション 2.9 を参照してください)、この回答と同様に、セッション自体でセッションが作成されたときにタイムスタンプを保存し (たとえば、session[:created_at])、各要求を確認します。これらの「デモ ユーザー」に対して期限切れにする必要がある場合:

before_filter :check_session

def check_session
  # TODO: check session validity
  if session[:demo_user] && session[:created_at] > 15.minutes.ago
    reset_session
    # TODO: redirect to login page
  end
end
于 2013-03-14T07:07:17.567 に答える
0

非常にエレガントな方法ではありませんが、これは単一のセッションで機能します。

...
request.env['rack.session.options'] = {expire_after: 15.minutes}
session[:user_id] = 1
...
于 2013-03-11T07:36:53.293 に答える