La nostra applicazione Django ha i seguenti requisiti di gestione delle sessioni.
- Le sessioni scadono quando l'utente chiude il browser.
- Le sessioni scadono dopo un periodo di inattività.
- Rileva quando una sessione scade a causa di inattività e mostra un messaggio appropriato all'utente.
- Avvisa gli utenti della scadenza di una sessione imminente pochi minuti prima della fine del periodo di inattività. Insieme all'avviso, fornisci agli utenti un'opzione per estendere la sessione.
- Se l'utente sta lavorando a una lunga attività commerciale all'interno dell'app che non prevede l'invio di richieste al server, la sessione non deve scadere .
Dopo aver letto la documentazione, il codice Django e alcuni post del blog relativi a questo, ho escogitato il seguente approccio di implementazione.
Requisito 1< /strong>
Questo requisito è facilmente implementabile impostando SESSION_EXPIRE_AT_BROWSER_CLOSE su True.
Requisito 2
Ho visto alcuni consigli per utilizzare SESSION_COOKIE_AGE per impostare la scadenza della sessione periodo. Ma questo metodo presenta i seguenti problemi.
La sessione scade sempre alla fine di SESSION_COOKIE_AGE anche se l'utente sta utilizzando attivamente l'applicazione. (Ciò può essere evitato impostando la scadenza della sessione a SESSION_COOKIE_AGE su ogni richiesta utilizzando un middleware personalizzato o salvando la sessione su ogni richiesta impostando SESSION_SAVE_EVERY_REQUEST su true. Ma il problema successivo è inevitabile a causa dell'uso di SESSION_COOKIE_AGE.)
A causa del modo in cui funzionano i cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE e SESSION_COOKIE_AGE si escludono a vicenda, ovvero il cookie scade alla chiusura del browser o alla scadenza indicata. Se viene utilizzato SESSION_COOKIE_AGE e l'utente chiude il browser prima della scadenza del cookie, il cookie viene conservato e la riapertura del browser consentirà all'utente (o a chiunque altro) di accedere al sistema senza essere nuovamente autenticato.
Django si basa solo sulla presenza del cookie per determinare se la sessione è attiva. Non controlla la data di scadenza della sessione memorizzata con la sessione.
Il metodo seguente potrebbe essere utilizzato per implementare questo requisito e risolvere i problemi sopra menzionati.
- Non impostare SESSION_COOKIE_AGE.
- Imposta la data di scadenza della sessione su "ora corrente + periodo di inattività" su ogni richiesta.
- Sostituisci process_request in SessionMiddleware e verifica la scadenza della sessione. Elimina la sessione se è scaduta.
Requisito 3
Quando rileviamo che la sessione è scaduta (nel SessionMiddleware personalizzato sopra), imposta un attributo sulla richiesta per indicare la scadenza della sessione. Questo attributo può essere utilizzato per visualizzare un messaggio appropriato per l'utente.
Requisito 4
Usa JavaScript per rilevare l'inattività dell'utente, fornire l'avviso e anche un'opzione per estendere la sessione. Se l'utente desidera estendere, inviare un impulso di mantenimento in vita al server per estendere la sessione.
Requisiti t 5
Utilizzare JavaScript per rilevare l'attività dell'utente (durante la lunga operazione aziendale) e inviare impulsi keep alive al server per impedire la scadenza della sessione.
L'approccio di implementazione di cui sopra sembra molto elaborato e mi chiedevo se potesse esistere un metodo più semplice (soprattutto per il Requisito 2).
Qualsiasi approfondimento sarà molto apprezzato.