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 visualizza il messaggio appropriato all'utente.
- Avvisa gli utenti dell'imminente scadenza della sessione pochi minuti prima della fine del periodo di inattività. Insieme all'avviso, fornire agli utenti un'opzione per estendere la propria sessione.
- Se l'utente sta lavorando a una lunga attività aziendale all'interno dell'app che non comporta 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 trovato il seguente approccio di implementazione.
Requisito 1
Questo requisito può essere facilmente implementato impostando SESSION_EXPIRE_AT_BROWSER_CLOSE su True.
Requisito 2
Ho visto alcuni consigli per utilizzare SESSION_COOKIE_AGE per impostare il periodo di scadenza della sessione. Ma questo metodo presenta i seguenti problemi.
La sessione scade sempre alla fine della SESSION_COOKIE_AGE anche se l'utente sta utilizzando attivamente l'applicazione. (Questo può essere evitato impostando la scadenza della sessione su 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 all'ora di scadenza specificata. 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 (oa 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 può essere utilizzato per implementare questo requisito e per 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 controlla la scadenza della sessione. Elimina la sessione se è scaduta.
Requisito 3
Quando rileviamo che la sessione è scaduta (nel SessionMiddleware personalizzato sopra), impostare un attributo sulla richiesta per indicare la scadenza della sessione. Questo attributo può essere utilizzato per visualizzare un messaggio appropriato all'utente.
Requisito 4
Utilizzare 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 keepalive al server per estendere la sessione.
Requisito 5
Utilizzare JavaScript per rilevare l'attività dell'utente (durante le lunghe operazioni aziendali) e inviare impulsi di mantenimento al server per impedire la scadenza della sessione.
L'approccio di implementazione di cui sopra sembra molto elaborato e mi chiedevo se potesse esserci un metodo più semplice (specialmente per il Requisito 2).
Eventuali approfondimenti saranno molto apprezzati.