Unsere Django-Anwendung hat die folgenden Anforderungen an das Sitzungsmanagement.
- Sitzungen laufen ab, wenn der Benutzer den Browser schließt.
- Sitzungen laufen nach einer Zeit der Inaktivität ab.
- Erkennen Sie, wann eine Sitzung aufgrund von Inaktivität abläuft, und zeigen Sie dem Benutzer die entsprechende Meldung an.
- Warnen Sie Benutzer vor dem bevorstehenden Ablauf einer Sitzung einige Minuten vor dem Ende des Inaktivitätszeitraums. Bieten Sie den Benutzern zusammen mit der Warnung die Option, ihre Sitzung zu verlängern.
- Wenn der Benutzer an einer langen Geschäftsaktivität in der App arbeitet, bei der keine Anforderungen an den Server gesendet werden, darf die Sitzung keine Zeitüberschreitung aufweisen.
Nachdem ich die Dokumentation, den Django-Code und einige diesbezügliche Blog-Beiträge gelesen habe, habe ich den folgenden Implementierungsansatz entwickelt.
Anforderung 1
Diese Anforderung kann einfach implementiert werden, indem SESSION_EXPIRE_AT_BROWSER_CLOSE auf True gesetzt wird.
Anforderung 2
Ich habe einige Empfehlungen zur Verwendung von SESSION_COOKIE_AGE zum Festlegen des Sitzungsablaufzeitraums gesehen. Diese Methode weist jedoch die folgenden Probleme auf.
Die Sitzung läuft immer am Ende der SESSION_COOKIE_AGE ab, auch wenn der Benutzer die Anwendung aktiv verwendet. (Dies kann verhindert werden, indem der Sitzungsablauf bei jeder Anforderung mit einer benutzerdefinierten Middleware auf SESSION_COOKIE_AGE gesetzt wird oder indem die Sitzung bei jeder Anforderung durch Setzen von SESSION_SAVE_EVERY_REQUEST auf true gespeichert wird. Das nächste Problem ist jedoch aufgrund der Verwendung von SESSION_COOKIE_AGE unvermeidbar.)
Aufgrund der Funktionsweise von Cookies schließen sich SESSION_EXPIRE_AT_BROWSER_CLOSE und SESSION_COOKIE_AGE gegenseitig aus, dh das Cookie läuft entweder beim Schließen des Browsers oder zum angegebenen Ablaufzeitpunkt ab. Wenn SESSION_COOKIE_AGE verwendet wird und der Benutzer den Browser schließt, bevor das Cookie abläuft, wird das Cookie beibehalten und durch erneutes Öffnen des Browsers kann der Benutzer (oder eine andere Person) das System betreten, ohne erneut authentifiziert zu werden.
Django verlässt sich nur darauf, dass das Cookie vorhanden ist, um festzustellen, ob die Sitzung aktiv ist. Das mit der Sitzung gespeicherte Ablaufdatum der Sitzung wird nicht überprüft.
Die folgende Methode könnte verwendet werden, um diese Anforderung zu implementieren und die oben genannten Probleme zu umgehen.
- Setzen Sie nicht SESSION_COOKIE_AGE.
- Stellen Sie das Ablaufdatum der Sitzung bei jeder Anforderung auf "Aktuelle Zeit + Inaktivitätszeitraum" ein.
- Überschreiben Sie process_request in SessionMiddleware und überprüfen Sie, ob die Sitzung abgelaufen ist. Verwerfen Sie die Sitzung, wenn sie abgelaufen ist.
Anforderung 3
Wenn wir feststellen, dass die Sitzung abgelaufen ist (in der benutzerdefinierten SessionMiddleware oben), legen Sie in der Anforderung ein Attribut fest, um den Ablauf der Sitzung anzuzeigen. Dieses Attribut kann verwendet werden, um dem Benutzer eine entsprechende Nachricht anzuzeigen.
Anforderung 4
Verwenden Sie JavaScript, um Benutzerinaktivität zu erkennen, die Warnung bereitzustellen und die Sitzung zu verlängern. Wenn der Benutzer verlängern möchte, senden Sie einen Keep-Alive-Impuls an den Server, um die Sitzung zu verlängern.
Anforderung 5
Verwenden Sie JavaScript, um Benutzeraktivitäten (während des langen Geschäftsbetriebs) zu erkennen und Keep-Alive-Impulse an den Server zu senden, um zu verhindern, dass die Sitzung abläuft.
Der obige Implementierungsansatz scheint sehr aufwendig zu sein, und ich habe mich gefragt, ob es eine einfachere Methode geben könnte (insbesondere für Anforderung 2).
Alle Erkenntnisse werden sehr geschätzt.