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 bezczynności.
- Wykryj, kiedy sesja wygasa z powodu braku aktywności i wyświetl odpowiednią wiadomość użytkownikowi.
- Ostrzegaj użytkowników o zbliżającym się wygaśnięciu sesji na kilka minut przed końcem okresu bezczynności. Wraz z ostrzeżeniem należy udostępnić użytkownikom opcję przedłużenia sesji.
- Jeśli użytkownik pracuje nad długą działalnością biznesową w aplikacji, która nie obejmuje wysyłania żądań do serwera, sesja nie może przekraczać limitu czasu.
Po przeczytaniu dokumentacji, kodu Django i kilku związanych z tym postów na blogu, wymyśliłem następujące podejście do implementacji.
Wymaganie 1
To wymaganie można łatwo zaimplementować, ustawiając SESSION_EXPIRE_AT_BROWSER_CLOSE na True.
Wymaganie 2
Widziałem kilka zaleceń dotyczących używania SESSION_COOKIE_AGE do ustawiania okresu wygaśnięcia sesji. Ale ta metoda ma następujące problemy.
Sesja zawsze wygasa 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 na SESSION_COOKIE_AGE dla każdego żądania przy użyciu niestandardowego oprogramowania pośredniczącego lub zapisując sesję dla każdego żądania, ustawiając SESSION_SAVE_EVERY_REQUEST na true. Jednak 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 wykluczają się wzajemnie, 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 zamyka przeglądarkę przed wygaśnięciem pliku cookie, plik cookie zostaje zachowany, a ponowne otwarcie przeglądarki umożliwi użytkownikowi (lub komukolwiek innemu) dostęp do systemu bez ponownego uwierzytelniania.
Django opiera się tylko na obecnym pliku cookie, aby określić, czy sesja jest aktywna. Nie sprawdza daty wygaśnięcia sesji przechowywanej w sesji.
Aby zaimplementować to wymaganie i obejść powyższe problemy, można zastosować następującą metodę.
- Nie ustawiaj SESSION_COOKIE_AGE.
- Ustaw datę wygaśnięcia sesji na „bieżący czas + okres bezczynności” dla każdego żądania.
- Zastąp process_request w SessionMiddleware i sprawdź wygaśnięcie sesji. Odrzuć sesję, jeśli wygasła.
Wymaganie 3
Gdy wykryjemy, że sesja wygasła (w niestandardowym SessionMiddleware powyżej), ustaw atrybut w żądaniu, aby wskazać wygaśnięcie sesji. Atrybut ten może służyć do wyświetlania użytkownikowi odpowiedniego komunikatu.
Wymaganie 4
Użyj JavaScript, aby wykryć brak aktywności użytkownika, przekazać ostrzeżenie, a także opcję przedłużenia sesji. Jeśli użytkownik chce przedłużyć sesję, wyślij do serwera impuls podtrzymujący, aby przedłużyć sesję.
Wymaganie 5
Użyj JavaScript do wykrywania aktywności użytkownika (podczas długich operacji biznesowych) i wysyłaj impulsy podtrzymujące do serwera, aby zapobiec wygaśnięciu sesji.
Powyższe podejście do implementacji wydaje się bardzo skomplikowane i zastanawiałem się, czy nie ma prostszej metody (szczególnie dla Wymagania 2).
Wszelkie spostrzeżenia będą bardzo mile widziane.