8
私は本当にアイデアのように。誰かがクッキーを盗む場合は、クッキーの署名が期限切れとクッキーの有効期限されていないので、彼/彼女は永続的にサイトにアクセスするためにそれを使用することができ、誰かがそれを盗まれた場合、それはクッキーを再利用してから停止しないため、ここでは役立ちません。より良い方法
私はクッキーの署名が転がると期限切れになるので、ユーザはまだサイトを使用している場合は、タイムスタンプを更新するために、1時間ごと5分後にセッションを期限切れにタイムスタンプを追加しました。
私はScalaのプレイフレームワークにはかなり新しいので、任意の提案や同じことを達成するためのより良い方法がはるかに高く評価されるだろうと思います。すべての5分生産
trait Secured {
def withAuth(f: => String => Request[AnyContent] => Result) = {
Security.Authenticated(username, onUnauthorized) { user =>
Action(request => {
val sessionRolloverPeriod = 300
val sessionExpiryTime = 3600
val sessionCreationTime: Int = request.session("ts").toInt
val currentTime = System.currentTimeMillis()/1000L
if(currentTime <= (sessionCreationTime + sessionExpiryTime)) {
if(currentTime >= (sessionCreationTime + sessionRolloverPeriod)) {
f(user)(request).withSession(request.session + ("ts" -> (System.currentTimeMillis()/1000L).toString))
} else {
f(user)(request)
}
} else {
Results.Redirect(routes.Auth.login()).withNewSession
}
}
)
}
}
}
クッキー:
The cookies produced every 5min:
Cookie:PS="a6bdf9df798c24a8836c2b2222ec1ea4a4251f301-username=admin&ts=1381180064"
Cookie:PS="D7edg7df709b54B1537c2b9862dc2eaff40001c90-username=admin&ts=1381180380"
プレイは、セッションクッキーを暗号化し、それで有効期限のタイムスタンプを含めても安全です。あなたはそれを正しくやっている、サーバー側のセッションの必要はありません。 – lambdas
同じことをやろうと思っていますが、これに欠陥があります。 f(ユーザ)(要求)コールが既にセッションを変更した場合はどうなりますか?この場合、リクエストのセッションを変更のベースとして使用すると、その変更が緩んでいますか? – agabor
私はちょうど興味があります:なぜあなたは "ロールオーバー"機能が必要でしょうか?認証されたリクエストごとにタイムスタンプを更新するだけでは十分ではないでしょうか? – Martin