Hoe kan ik een sessie laten verlopen vanwege inactiviteit in Django?

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

Onze Django-applicatie heeft de volgende vereisten voor sessiebeheer.

  1. Sessies verlopen wanneer de gebruiker de browser sluit.
  2. Sessies verlopen na een periode van inactiviteit.
  3. Detecteer wanneer een sessie verloopt vanwege inactiviteit en geef de gebruiker een passend bericht weer.
  4. Waarschuw gebruikers een paar minuten voor het einde van de inactiviteitsperiode voor een naderende sessie. Geef gebruikers naast de waarschuwing ook een optie om hun sessie te verlengen.
  5. Als de gebruiker werkt aan een langdurige zakelijke activiteit binnen de app waarbij geen verzoeken naar de server worden gestuurd, mag de sessie geen time-out krijgen .

Na het lezen van de documentatie, Django-code en enkele blogberichten die hiermee verband houden, ben ik tot de volgende implementatieaanpak gekomen.

Vereiste 1< /strong>
Deze vereiste kan eenvoudig worden geïmplementeerd door SESSION_EXPIRE_AT_BROWSER_CLOSE in te stellen op True.

Vereiste 2
Ik heb een paar aanbevelingen gezien om SESSION_COOKIE_AGE te gebruiken om de vervaldatum van de sessie in te stellen periode. Maar deze methode heeft de volgende problemen.

  • De sessie verloopt altijd aan het einde van de SESSION_COOKIE_AGE, zelfs als de gebruiker de applicatie actief gebruikt. (Dit kan worden voorkomen door in te stellen de sessie verloopt naar SESSION_COOKIE_AGE op elk verzoek met behulp van een aangepaste middleware of door de sessie op elk verzoek op te slaan door in te stellen SESSION_SAVE_EVERY_REQUEST naar waar. Maar het volgende probleem is onvermijdelijk vanwege het gebruik van SESSION_COOKIE_AGE.)

  • Vanwege de manier waarop cookies werken, sluiten SESSION_EXPIRE_AT_BROWSER_CLOSE en SESSION_COOKIE_AGE elkaar uit. op de aangegeven vervaltijd. Als SESSION_COOKIE_AGE wordt gebruikt en de gebruiker de browser sluit voordat de cookie verloopt, blijft de cookie behouden en als de browser opnieuw wordt geopend, kan de gebruiker (of iemand anders) het systeem betreden zonder opnieuw te worden geverifieerd.

  • Django vertrouwt alleen op de aanwezige cookie om te bepalen of de sessie actief is. Het controleert niet de vervaldatum van de sessie die bij de sessie is opgeslagen.

De volgende methode kan worden gebruikt om deze vereiste te implementeren en om de bovengenoemde problemen te omzeilen.

  • Stel SESSION_COOKIE_AGE niet in.
  • Stel de vervaldatum van de sessie in op "huidige tijd + inactiviteitsperiode" bij elk verzoek.
  • Overschrijf process_request in SessionMiddleware en controleer of de sessie is verlopen. Gooi de sessie weg als deze is verlopen.

Vereiste 3
Wanneer we detecteren dat de sessie is verlopen (in de aangepaste SessionMiddleware hierboven), stelt u een kenmerk in op het verzoek om het verlopen van de sessie aan te geven. Dit kenmerk kan worden gebruikt om een passend bericht aan de gebruiker weer te geven.

Vereiste 4
Gebruik JavaScript om detecteer inactiviteit van de gebruiker, geef de waarschuwing en ook een optie om de sessie te verlengen. Als de gebruiker wil verlengen, stuur dan een keep alive-puls naar de server om de sessie te verlengen.

Vereisten t 5
Gebruik JavaScript om gebruikersactiviteit te detecteren (tijdens de lange bedrijfsvoering) en stuur keep alive-pulsen naar de server om te voorkomen dat de sessie verloopt.


De bovenstaande implementatieaanpak lijken erg uitgebreid en ik vroeg me af of er misschien een eenvoudigere methode is (vooral voor vereiste 2).

Alle inzichten worden zeer op prijs gesteld.