Wie kann ich eine Sitzung aufgrund von Inaktivität in Django ablaufen lassen?

| | | | | | | | | | | | | | | | | |

Unsere Django-Anwendung hat die folgenden Sitzungsverwaltungsanforderungen.

  1. Sitzungen laufen ab, wenn der Benutzer den Browser schließt.
  2. Sitzungen laufen nach einer Zeit der Inaktivität ab.
  3. Erkennen Sie, wenn eine Sitzung aufgrund von Inaktivität abläuft, und zeigen Sie dem Benutzer eine entsprechende Meldung an.
  4. Warnen Sie Benutzer einige Minuten vor dem Ende der Inaktivitätszeit vor dem bevorstehenden Ablauf einer Sitzung. Bieten Sie den Benutzern zusammen mit der Warnung eine Option zum Verlängern ihrer Sitzung.
  5. Wenn der Benutzer an einer langen Geschäftsaktivität innerhalb der App arbeitet, bei der keine Anfragen an den Server gesendet werden, darf die Sitzung keine Zeitüberschreitung aufweisen .

Nachdem ich die Dokumentation, den Django-Code und einige diesbezügliche Blogbeiträge gelesen habe, bin ich zu folgendem Implementierungsansatz gekommen.

Anforderung 1< /strong>
Diese Anforderung lässt sich leicht implementieren, 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 Sitzungsablaufs gesehen Diese Methode hat jedoch folgende Probleme.

  • Die Session läuft immer am Ende des SESSION_COOKIE_AGE ab, auch wenn der Benutzer die Anwendung aktiv nutzt (dies kann durch die Einstellung verhindert werden den Sitzungsablauf auf SESSION_COOKIE_AGE bei jeder Anfrage mit einer benutzerdefinierten Middleware oder durch Speichern der Sitzung bei jeder Anfrage per Einstellung SESSION_SAVE_EVERY_REQUEST auf wahr. Aber das nächste Problem ist durch die Verwendung von SESSION_COOKIE_AGE unvermeidlich.)

  • 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 ab oder zum angegebenen Ablaufzeitpunkt. Wenn SESSION_COOKIE_AGE verwendet wird und der Benutzer den Browser schließt, bevor das Cookie abläuft, wird das Cookie beibehalten und das erneute Öffnen des Browsers ermöglicht dem Benutzer (oder jeder anderen Person) den Zugriff auf das System ohne erneute Authentifizierung.

  • Django verlässt sich nur darauf, dass das Cookie vorhanden ist, um festzustellen, ob die Sitzung aktiv ist. Es überprüft nicht das mit der Sitzung gespeicherte Ablaufdatum der Sitzung.

Die folgende Methode könnte verwendet werden, um diese Anforderung zu implementieren und die oben genannten Probleme zu umgehen.

  • Legen Sie nicht SESSION_COOKIE_AGE fest.
  • Legen Sie das Ablaufdatum der Sitzung bei jeder Anfrage auf "aktuelle Zeit + Inaktivitätszeitraum" fest.
  • Überschreiben Sie process_request in SessionMiddleware und prü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 ein Attribut für die Anfrage 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 Inaktivität des Benutzers erkennen, Warnung und auch eine Option zum Verlängern der Sitzung bereitstellen. Wenn der Benutzer die Sitzung verlängern möchte, einen Keep-Alive-Impuls an den Server senden, um die Sitzung zu verlängern.

Anforderungen t 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 scheinen sehr kompliziert zu sein, und ich habe mich gefragt, ob es eine einfachere Methode gibt (insbesondere für Anforderung 2).

Jeder Einblick wird sehr geschätzt.