Nasza aplikacja Django ma następujące wymagania dotyczące zarządzania sesjami.
- Sesje wygasają, gdy użytkownik zamyka przeglądarkę.
- Sesje wygasają po okresie braku aktywności.
- Wykryj wygaśnięcie sesji z powodu braku aktywności i wyświetl odpowiednią wiadomość dla użytkownika.
- 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.
- 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.