Dans Laravel, est-il possible de prolonger dynamiquement la durée de la session en fonction de l'itinéraire consulté ?
P粉019353247
2023-09-01 17:36:54
<p>Le titre résume assez bien mon problème. </p>
<p>L'entreprise pour laquelle je travaille dispose d'une application Laravel dans laquelle la durée de la session sur <code>config/session.php</code> doit expirer après <strong>120 minutes</strong> Nous ne voulons pas changer cette valeur. </p>
<p>Mais le système a une fonctionnalité spécifique selon laquelle l'utilisateur doit répondre à un grand nombre de formulaires/questionnaires,<strong>si l'utilisateur est lent à taper, cela peut prendre plus de 3 ou 4 heures pour le remplir</ strong>Retournez avant de soumettre Reconsidérez certaines réponses. </p>
<p>Le problème est que certains utilisateurs n'ont toujours pas répondu à toutes les questions, et l'expiration de la session leur fait perdre leur progression, et parfois ils ne découvrent qu'après quelques minutes qu'ils sont passés à la "page suivante". de questions. Nous avons envisagé de sauvegarder les données déjà renseignées, mais même si nous conservions le contenu avec un appel AJAX et enregistrions la partie déjà renseignée dans la base de données, devoir se reconnecter en répondant au formulaire serait toujours une mauvaise expérience utilisateur car ils devraient de toute façon le suivre, créer à nouveau un lien vers la page du formulaire. Nous recevons beaucoup de plaintes de clients en raison de l'expiration de sessions. </p>
<p>La meilleure solution est de créer une sorte de fonction sur <code>FormController.php</code> et lorsque l'utilisateur entre dans la page de formulaire ou dans un autre itinéraire spécifique, nous exécuterons quelque chose comme <code>session () Opération ->extendSessionInMinutes(360)</code>. J'ai fait quelques recherches mais je n'ai rien trouvé de similaire dans la documentation de Laravel (veuillez noter que nous utilisons <code>Laravel 8.1</code>) ou Stackoverflow. J'ai beaucoup lu sur ce sujet cette semaine, comme une solution concernant la création d'un nouveau middleware qui fournit un cycle de vie de session différent en fonction du rôle de l'utilisateur ou quelque chose comme ça, mais cette option n'a pas fonctionné pour nous. </p>
<p>Je travaille sur une solution qui utilisera une solution similaire pour ajouter une <strong>nouvelle variable</strong> <code>session()->put('time_to_logout' , now()- >addHours( 2))</code> pour savoir exactement quand la session atteint 2 heures, afin que je puisse<strong>définir la valeur par défaut de <code>SESSION_LIFETIME</code></strong> la valeur à 5 heures et ajoutez une fonction JS pour vérifier toutes les 30 minutes si la déconnexion est requise et rediriger l'utilisateur vers la page de déconnexion, s'il est sur la page du formulaire nous arrêterons la vérification. </p>
<p>Mais je ne pense pas que ce soit réellement une bonne solution, mais je n'arrive pas à penser à une autre solution.Existe-t-il un moyen d'accomplir ce que je veux en prolongeant la durée de la session d'une manière ou d'une autre ? Ou recréez la session sans affecter l'utilisateur (<em> Je parie que cela gâchera le jeton CSRF sur le formulaire </em>) et donnez-lui 2 heures pendant qu'il continue de remplir le formulaire. Les fois ci-dessus, recréez la session de manière transparente sans avez-vous remarqué des changements ? </p>
<p>Une fois qu'une session est créée, son délai d'expiration ne peut pas être modifié ? Existe-t-il une sorte de bibliothèque PHP qui peut m'aider sans trop modifier les fonctionnalités liées à la session par défaut de Laravel ? </p>
<p><em>Merci d'avance pour vos commentaires. </em></p>
Oui, vous pouvez. Et vous devez faire ce qui suit -
à
IlluminateSessionMiddlewareStartSession::class,
之前添加AppHttpMiddlewareChangeSessionValueDynamically::class,
.AppHttpMiddlewareChangeSessionValueDynamically::class
comme indiqué ci-dessous -