16

Play はどのように Cookie を検証しますか?

  • サーバーを再起動した後、データベースにセッション データを保存していないにもかかわらず、まだログインしていることに気付きました。
  • また、サーバーの日付を Cookie の有効期限よりも大きく設定できることにも気付きましたが、それでもログインできました。
  • ログアウトした (Cookie をテキスト ファイルに保存した) と、ブラウザーは Cookie を失いました。次に、テキスト ファイルから Cookie を再作成し、再度ログインしました。

クッキーは次のようになります。

PLAY_SESSION=e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-userid%3A1

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

ドキュメントから
セッション
全体を破棄する セッション全体を破棄する特別な操作があります。

Ok("Bye").withNewSession
4

2 に答える 2

11

ユーザーを認証する方法を指定していないので、単純なサンプルを使用していると思います...単純です。

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

サーバー側にセッションのキー用の領域を作成する必要があります。DBまたはメモリキャッシュ内(DBより高速になります)。そのキーは、ログイン アクションが成功するたびにランダムに生成される必要があり (できれば非常に長いものである必要があります)、ユーザーを識別するためのデータ、有効期限なども含まれている必要がありますsess_key。彼の行は DB にあり、ログアウトおよび/または有効期限が切れた後は削除する必要があります。このような場合、ログアウト後に Cookie を失ったとしても、 non-esixting では正常にログインできなくなりますsess_key

AFAIR 標準メモリ キャッシュは、アプリケーションを再起動するたびに消去されます。これによりsess_keys、DB からすべてが削除され、Global オブジェクトを使用してメソッドでテーブルを切り捨てることができますonStart(...)

于 2013-01-31T15:02:10.223 に答える