Comment faire expirer une session en raison d’une inactivité dans Django ?

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

Notre application Django a les exigences de gestion de session suivantes.

  1. Les sessions expirent lorsque l'utilisateur ferme le navigateur.
  2. Les sessions expirent après une période d'inactivité.
  3. Détecter l'expiration d'une session en raison d'une inactivité et afficher le message approprié à l'utilisateur.
  4. Avertir les utilisateurs de l'expiration imminente d'une session quelques minutes avant la fin de la période d'inactivité. En plus de l'avertissement, offrez aux utilisateurs la possibilité de prolonger leur session.
  5. Si l'utilisateur travaille sur une longue activité commerciale au sein de l'application qui n'implique pas l'envoi de requêtes au serveur, la session ne doit pas expirer .

Après avoir lu la documentation, le code Django et quelques articles de blog liés à cela, j'ai proposé l'approche de mise en œuvre suivante.

Exigence 1< /strong>
Cette exigence est facilement mise en œuvre en définissant SESSION_EXPIRE_AT_BROWSER_CLOSE sur True.

Exigence 2
J'ai vu quelques recommandations pour utiliser SESSION_COOKIE_AGE pour définir l'expiration de la session Mais cette méthode présente les problèmes suivants.

  • La session expire toujours à la fin de SESSION_COOKIE_AGE même si l'utilisateur utilise activement l'application. (Cela peut être évité en définissant l'expiration de la session à SESSION_COOKIE_AGE à chaque requête à l'aide d'un middleware personnalisé ou en enregistrant la session à chaque requête en définissant SESSION_SAVE_EVERY_REQUEST à vrai. Mais le problème suivant est inévitable en raison de l'utilisation de SESSION_COOKIE_AGE.)

  • En raison du fonctionnement des cookies, SESSION_EXPIRE_AT_BROWSER_CLOSE et SESSION_COOKIE_AGE s'excluent mutuellement, c'est-à-dire que le cookie expire à la fermeture du navigateur ou à l'heure d'expiration spécifiée. Si SESSION_COOKIE_AGE est utilisé et que l'utilisateur ferme le navigateur avant l'expiration du cookie, le cookie est conservé et la réouverture du navigateur permettra à l'utilisateur (ou à toute autre personne) d'accéder au système sans être ré-authentifié.

  • Django s'appuie uniquement sur la présence du cookie pour déterminer si la session est active. Il ne vérifie pas la date d'expiration de la session stockée avec la session.

La méthode suivante peut être utilisée pour mettre en œuvre cette exigence et pour contourner les problèmes mentionnés ci-dessus.

  • Ne définissez pas SESSION_COOKIE_AGE.
  • Définissez la date d'expiration de la session sur "heure actuelle + période d'inactivité" pour chaque requête.
  • Remplacez process_request dans SessionMiddleware et vérifiez l'expiration de la session. Supprimez la session si elle a expiré.

Exigence 3
Lorsque nous détectons que la session a expiré (dans le SessionMiddleware personnalisé ci-dessus), définissez un attribut sur la demande pour indiquer l'expiration de la session. Cet attribut peut être utilisé pour afficher un message approprié à l'utilisateur.

Exigence 4
Utilisez JavaScript pour détecter l'inactivité de l'utilisateur, fournir l'avertissement et également une option pour prolonger la session. Si l'utilisateur souhaite prolonger, envoyer une impulsion de maintien au serveur pour prolonger la session.

Exigences t 5
Utilisez JavaScript pour détecter l'activité de l'utilisateur (pendant la longue opération commerciale) et envoyer des impulsions de maintien au serveur pour empêcher l'expiration de la session.


L'approche de mise en œuvre ci-dessus semblent très élaborés et je me demandais s'il pourrait y avoir une méthode plus simple (en particulier pour l'exigence 2).

Toute idée sera très appréciée.