Ich mag die Idee, Sitzungsdaten auf dem Benutzer-Browser zu behalten, aber nicht die Tatsache, dass Session-Cookies sind nicht sehr sicher im Spiel-Framework. Wenn jemand den Cookie stiehlt, kann er/sie damit permanent auf die Seite zugreifen, da die Cookie-Signatur nicht abläuft und der Cookie-Ablauf hier nicht hilft, da es nicht aufhört den Cookie wiederzuverwenden, wenn jemand ihn gestohlen hat.Bessere Möglichkeiten, um sicherere Play Scala Framework-Sitzung über Cookie zu implementieren
Ich habe einen Zeitstempel hinzugefügt, um die Sitzung nach 1 Stunde und alle 5 Minuten ablaufen zu lassen, um den Zeitstempel zu aktualisieren, wenn der Benutzer die Seite noch verwendet, so dass die Cookie-Signatur läuft und abläuft.
Ich bin ziemlich neu zu skalieren und Framework zu spielen, so dass alle Vorschläge oder bessere Möglichkeiten, das gleiche zu erreichen, sehr geschätzt werden würde.
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
}
}
)
}
}
}
Plätzchen jeden 5min produziert:
The cookies produced every 5min:
Cookie:PS="a6bdf9df798c24a8836c2b2222ec1ea4a4251f301-username=admin&ts=1381180064"
Cookie:PS="D7edg7df709b54B1537c2b9862dc2eaff40001c90-username=admin&ts=1381180380"
Play verschlüsselt den Sitzungscookie, sodass es sicher ist, den Ablaufzeitstempel darin einzufügen. Sie machen es richtig, keine Notwendigkeit für Server-Side-Session. – lambdas
Ich denke darüber nach, das Gleiche zu tun, aber ich sehe darin einen Fehler. Was passiert, wenn der Aufruf f (user) (request) die Sitzung bereits geändert hat? In diesem Fall verlieren Sie diese Änderung, wenn Sie die Sitzung der Anfrage als Basis für die Änderung verwenden, nicht wahr? – agabor
Ich bin nur neugierig: Warum brauchen Sie diese "Rollover" -Funktion? Wäre es nicht ausreichend, den Zeitstempel bei jeder authentifizierten Anfrage einfach zu aktualisieren (natürlich, wenn nicht abgelaufen)? – Martin