Jak wygasnąć sesję z powodu braku aktywności w Django?

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

Nasza aplikacja Django ma następujące wymagania dotyczące zarządzania sesjami.

  1. Sesje wygasają, gdy użytkownik zamyka przeglądarkę.
  2. Sesje wygasają po okresie braku aktywności.
  3. Wykryj wygaśnięcie sesji z powodu braku aktywności i wyświetl odpowiednią wiadomość dla użytkownika.
  4. Ostrzegaj użytkowników o zbliżającym się wygaśnięciu sesji na kilka minut przed końcem okresu braku aktywności. Wraz z ostrzeżeniem zapewnij użytkownikom opcję przedłużenia sesji.
  5. Jeśli użytkownik prowadzi długą działalność biznesową w aplikacji, która nie wymaga wysyłania żądań do serwera, sesja nie może przekroczyć limitu czasu .

Po przeczytaniu dokumentacji, kodu Django i niektórych wpisów na blogu z tym związanych, wymyśliłem następujące podejście do implementacji.

Wymaganie 1< /strong>
To wymaganie można łatwo wdrożyć, ustawiając SESSION_EXPIRE_AT_BROWSER_CLOSE na Prawda.

Wymaganie 2
Znam kilka zaleceń dotyczących użycia SESSION_COOKIE_AGE do ustawienia wygaśnięcia sesji Jednak ta metoda ma następujące problemy.

  • Sesja wygasa zawsze z końcem SESSION_COOKIE_AGE, nawet jeśli użytkownik aktywnie korzysta z aplikacji. (Można temu zapobiec, ustawiając wygaśnięcie sesji do SESSION_COOKIE_AGE przy każdym żądaniu przy użyciu niestandardowego oprogramowania pośredniczącego lub poprzez zapisanie sesji przy każdym żądaniu poprzez ustawienie SESSION_SAVE_EVERY_REQUEST na prawdę. Ale następny problem jest nieunikniony ze względu na użycie SESSION_COOKIE_AGE.)

  • Ze względu na sposób działania plików cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE i SESSION_COOKIE_AGE wzajemnie się wykluczają, tj. plik cookie wygasa po zamknięciu przeglądarki lub w określonym czasie wygaśnięcia. Jeśli używana jest SESSION_COOKIE_AGE, a użytkownik zamknie przeglądarkę przed wygaśnięciem pliku cookie, plik cookie zostanie zachowany, a ponowne otwarcie przeglądarki pozwoli użytkownikowi (lub komukolwiek innemu) na wejście do systemu bez ponownego uwierzytelnienia.

  • Django opiera się tylko na obecnym pliku cookie, aby określić, czy sesja jest aktywna. Nie sprawdza daty wygaśnięcia sesji przechowywanej wraz z sesją.

Następująca metoda może zostać wykorzystana do zaimplementowania tego wymagania i obejścia problemów wymienionych powyżej.

  • Nie ustawiaj SESSION_COOKIE_AGE.
  • Ustaw datę wygaśnięcia sesji na „bieżący czas + okres nieaktywności” dla każdego żądania.
  • Zastąp process_request w SessionMiddleware i sprawdź, czy sesja wygasła. Odrzuć sesję, jeśli wygasła.

Wymaganie 3
Gdy wykryjemy, że sesja wygasła (w niestandardowym oprogramowaniu SessionMiddleware powyżej), ustaw atrybut w żądaniu, aby wskazać wygaśnięcie sesji. Ten atrybut może służyć do wyświetlania użytkownikowi odpowiedniego komunikatu.

Wymaganie 4
Użyj JavaScript do wykryj brak aktywności użytkownika, podaj ostrzeżenie, a także opcję przedłużenia sesji. Jeśli użytkownik chce przedłużyć, wyślij do serwera impuls podtrzymania aktywności, aby przedłużyć sesję.

Wymagania t 5
Użyj JavaScript do wykrywania aktywności użytkownika (podczas długiej działalności biznesowej) i wysyłaj impulsy podtrzymujące do serwera, aby zapobiec wygaśnięciu sesji.


Powyższe podejście do implementacji wydają się bardzo skomplikowane i zastanawiałem się, czy istnieje prostsza metoda (szczególnie dla wymagania 2).

Wszelkie spostrzeżenia będą bardzo mile widziane.