2013-10-07 3 views
8

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" 
+1

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

+0

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

+0

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

Antwort

2

Scheint mir vernünftig, ich es wahrscheinlich setzen server aber geben dem Kunden eine „Session-ID“ und die Sitzung löschen, wenn sich ein Benutzer abmeldet. Auf der Client-Seite bedeutet dies, dass es keine Möglichkeit gibt, die Sitzung ungültig zu machen, wenn sie gestohlen wurde, außer dass sie auf die Zeitüberschreitung wartet.

Verwandte Themen