2013-01-31 11 views
14

Come funziona la convalida di un cookie?
Play framework come funzionano le sessioni e i cookie?

  • ho notato che dopo aver riavviato il server ero ancora collegato anche se io non presist tutti i dati di sessione nel database.
  • Ho anche notato che ho potuto impostare la data sul server per essere più grande che la data exipry del biscotto e ancora mi è stato registrato.
  • mi sono collegato fuori (salvato il cookie ad un testo file) e il browser ha perso il cookie. Quindi I ricreato il cookie dal file di testo e mi sono registrato nuovamente.

Il cookie è simile al seguente:

PLAY_SESSION = e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-userid% 3A1

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

From the documentation
Scartando l'intera sessione
C'è speciale operazione che scarta l'intera sessione:

Ok("Bye").withNewSession 

risposta

5

Ho trovato la risposta leggendo the documentation più attentamente e combinando diverse parti.

Non esiste un timeout tecnico per la sessione. Scade quando l'utente chiude il browser web. Se è necessario un timeout funzionale per un'applicazione specifica , è sufficiente memorizzare un timestamp nella sessione utente e utilizzarlo comunque richiesto dall'applicazione (ad esempio per una durata massima della durata , la massima durata di inattività, ecc.).


E 'importante capire che i dati di sessione e Flash non sono memorizzate dal server, ma vengono aggiunti a ogni successiva richiesta HTTP, utilizzando il meccanismo dei cookie. Ciò significa che la dimensione dei dati è molto limitata a (fino a 4 KB) e che è possibile memorizzare solo valori di stringa.


Quindi, che era quello che temevo che se il cookie perdersi chiunque può accedere al server per tutte le future.

Cosa devo fare per garantire questo è quello di aggiungere un self-made autorizzazione timestamp (salvare un timestamp nel cookie e convalidare lato sever)

+0

"se il cookie si perde, chiunque può accedere al server per tutto il futuro", cosa significa? Se non ci sono cookie, non c'è accesso, è tutto client side, Play garantisce solo che il cookie (firmato) stesso non sia stato manomesso. – virtualeyes

+1

Non pensare al vuoto come al vuoto ma allo smarrimento. – Farmor

+1

In futuro, si prega di collegare ai documenti pertinenti, per consentire ai lettori delle vostre risposte di approfondire ulteriormente. – Cheeso

10

Non hai specificato come si fa autenticare gli utenti, in modo da supponiamo solo che tu stia usando un semplice campione che è ... semplice.

Utilizza l'id utente per identificare l'utente e controlla se il cookie di sessione firmato non è stato manipolato, quindi se si ricrea il cookie con la firma corretta sarà ancora valido.

Si dovrebbe creare un'area per i tasti di sessione sul lato server ie. in DB o nella cache di memoria (che sarà più veloce di DB). La sua chiave dovrebbe essere generata casualmente (e prefissibilmente piuttosto lunga) per ogni azione di login di successo, e dovrebbe contenere anche dati per l'identificazione dell'utente, data di scadenza ecc. Quindi dovresti mettere questo random sess_key alla sessione di Play invece dell'indirizzo email dell'utente registrato o id della sua riga in DB, e dopo il logout e/o la data di scadenza dovrebbe essere rimosso. In tal caso, anche se perderai il cookie dopo il logout, sarà impossibile accedere correttamente con lo sess_key non-esixt. cache di memoria standard

AFAIR verrà eliminato ad ogni riavvio dell'applicazione, per assicurarsi che tutto sess_keys da DB verranno rimossi, come ben si può utilizzare Global object e troncare la tabella in onStart(...) metodo.

+0

È giusto a questo punto rimanere semplicemente fuori dall'ecosistema della sessione di Play (per quanto riguarda l'autenticazione)? Sto pensando di utilizzare redis per una cache semi-duratura per gestire gli ID sesh e utilizzare separatamente le sessioni di Play per l'archiviazione dei dati delle sessioni pubbliche. Sembra un buon piano? –

Problemi correlati