Notre application Django a les exigences de gestion de session suivantes.
- Les sessions expirent lorsque l'utilisateur ferme le navigateur.
- Les sessions expirent après une période d'inactivité.
- Détecte lorsqu'une session expire en raison d'une inactivité et affiche le message approprié à l'utilisateur.
- Avertissez 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é d'étendre leur session.
- Si l'utilisateur travaille sur une longue activité commerciale au sein de l'application qui n'implique pas l'envoi de demandes 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 d'implémentation suivante.
Condition 1
Cette exigence est facilement mise en œuvre en définissant SESSION_EXPIRE_AT_BROWSER_CLOSE sur True.
Condition 2
J'ai vu quelques recommandations pour utiliser SESSION_COOKIE_AGE pour définir la période d'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 session sur SESSION_COOKIE_AGE à chaque demande à l'aide d'un middleware personnalisé ou en enregistrant la session à chaque demande en définissant SESSION_SAVE_EVERY_REQUEST sur true. 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 implémenter 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 demande.
- Remplacez process_request dans SessionMiddleware et vérifiez l'expiration de la session. Ignorez la session si elle a expiré.
Condition 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.
Condition 4
Utilisez JavaScript pour détecter l'inactivité de l'utilisateur, fournissez l'avertissement et également une option pour prolonger la session. Si l'utilisateur souhaite étendre, envoyez une impulsion de maintien en vie au serveur pour étendre la session.
Condition 5
Utilisez JavaScript pour détecter l'activité de l'utilisateur (pendant la longue opération commerciale) et envoyer des impulsions de maintien en vie au serveur pour empêcher l'expiration de la session.
L'approche de mise en œuvre ci-dessus semble très élaborée et je me demandais s'il pourrait y avoir une méthode plus simple (en particulier pour l'exigence 2).
Toutes les idées seront très appréciées.