2013-01-31 4 views
14

プレイはどのようにクッキーを検証しますか?
セッションの再生とクッキーの仕組みは?

  • 私は、サーバーを再起動した後、私はまだ私は、データベース内のすべてのセッションデータをpresistません にもかかわらず、ログインしたことに気づきました。
  • はまた、私はクッキーのexipry 日は、まだ私がログインしたことも大きくなるように、サーバー上の日付を設定することができ に気づいた。
  • 私は をログアウト(テキストにクッキーを保存しましたファイル)、ブラウザはCookieを失いました。その後、私は は、テキストファイルからクッキーを再作成し、私は再びログインしました。

クッキーは次のようになります。
破棄され、特別な操作はあり

PLAY_SESSION = e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-ユーザID%3A1

// My logout code 
def logout() = Action { 
    Ok("").withNewSession 
} 

From the documentation
セッション全体を破棄全体のセッション:

Ok("Bye").withNewSession 

答えて

5

回答が見つかったthe documentationより慎重に別の部分を組み合わせました。

セッションに技術的なタイムアウトはありません。 ユーザーがWebブラウザを閉じると、期限が切れます。 特定のアプリケーションの機能タイムアウトが必要な場合は、ユーザーセッションにタイムスタンプを保存してください( の期間、最大の非アクティブ期間など)。


それはセッションとフラッシュのデータがサーバーに格納さ はありませんが、クッキーのメカニズムを使用して後続の各HTTPリクエスト、 に追加されていることを理解することが重要です。これは、データサイズが非常に (最大4 KB)に制限され、文字列値のみを格納できることを意味します。


だから、私はクッキーが迷子にならば、誰もがすべての将来のためにサーバーにログインできることを恐れていたものでした。私は、これは自作のタイムスタンプの許可を追加することで確保するために何をすべきか

(cookieにタイムスタンプを保存し、サーバ側の検証)

+0

「クッキーが失われた場合、今後誰かがサーバーにログインできます。」とはどういう意味ですか?クッキーがない場合、アクセスはありません。クライアント側のすべてです。Playは、(署名された)クッキー自体が改ざんされていないことを保証します。 – virtualeyes

+1

失われたとは考えていませんが、迷子になってしまいました。 – Farmor

+1

将来的には、あなたの回答の読者がさらに調査できるよう、関連する文書にリンクしてください。 – Cheeso

10

あなたはどのようにユーザーを認証するか指定するので、私はなかったですちょっと推測すると、単純なサンプルを使って再...単純です。

ユーザーのIDを使用してユーザーを識別し、署名されたセッションCookieが操作されなかったかどうかを確認します。したがって、適切な署名でCookieを再作成すると、有効になります。

セッションのキー用の領域をサーバー側に作成する必要があります。 DBまたはメモリキャッシュ(どちらがDBよりも速いでしょう)にあります。そのキーは、成功したログインアクションごとに無作為に生成されるべきであり(また、かなり長い間)、またユーザー、有効期限などを識別するためのデータが含まれている必要があります。次に、sess_keyをPlayのセッションに入れてください彼の行のDBで、ログアウトや有効期限が切れた後に削除する必要があります。そのような場合、ログアウト後にクッキーを失っても、非エシフレートのsess_keyで正しくログインすることは不可能です。

アプリケーションの再起動ごとにAFAIR標準メモリキャッシュが削除され、sess_keysがDBからも削除されることを確認してから、Global objectを使用してonStart(...)メソッドでテーブルを切り捨てることができます。

+0

Playのセッションエコシステム(認証が行われている限り)から抜け出すのは現時点では公正でしょうか?私はセディIDを管理し、パブリックセッションデータを格納するためにPlayのセッションを別々に使用するために、半耐久性キャッシュにredisを使用することを考えています。これは良い計画のような音ですか? –