[SPIP Zone] Redirection automatique d'un utilisateur à l'expiration de sa session

Bonjour,

Existe-t-il nativement sur SPIP une solution pour prévenir un utilisateur connecté que sa session est expirée, sans qu’il ait besoin de charger une page (donc en AJAX) ? Idéalement, quand la session de l’utilisateur est expirée, le système lui propose de ressaisir ses identifiants dans une boite de dialogue et lui réaffiche ensuite la page sur laquelle il était, pour éviter de lui faire perdre d’éventuelles informations saisies dans des champs de formulaire.

S’il n’existe rien de natif, cette solution basée sur Jquery pourrait-elle faire l’affaire : http://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html ?

-Frédéric

Je serais partisan de faire plus simple en repoussant silencieusement la date de fin de la session chaque fois que le client est vu comme connecté.

Sauf erreur, ça ne couvrirait pas le cas où l’utilisateur ouvre une session, commence à compléter un formulaire, laisse sa session expirer/fenêtre ouverte, puis enregistre le formulaire alors que son compte est déconnecté. La date d’expiration de la session ne peut pas être rallongée puisque l’utilisateur est déjà déconnecté. Dans ce cas précis, soit les informations que l’utilisateur avait saisi sont perdues (cas très frustrant pour l’utilisateur), soit les informations sont soumises mais non rattachées à son id_auteur (cas très frustrant pour le webmestre).

-Frédéric

Envoyé : Thursday, April 14, 2016 2:18 PM

2016-04-14 20:34 GMT+02:00 Frédéric Lohier <associate-it@ambascience-usa.org

:

Sauf erreur, ça ne couvrirait pas le cas où l’utilisateur ouvre une
session, commence à compléter un formulaire, laisse sa session
expirer/fenêtre ouverte, puis enregistre le formulaire alors que son compte
est déconnecté.

tu veux dire … laisse sa fenêtre ouverte durant au moins deux jours ?

La date d’expiration de la session ne peut pas être rallongée puisque
l’utilisateur est déjà déconnecté. Dans ce cas précis, soit les
informations que l’utilisateur avait saisi sont perdues (cas très frustrant
pour l’utilisateur), soit les informations sont soumises mais non
rattachées à son id_auteur (cas très frustrant pour le webmestre).

pas forcément, on pourrait très bien repêcher la session au moment du POST,
à condition qu'elle ne soit pas déjà passée par le garbage collector.

-- Fil

tu veux dire … laisse sa fenêtre ouverte durant au moins deux jours ?

Oui, exactement, en ayant probablement mis sa machine en veille entre temps.

pas forcément, on pourrait très bien repêcher la session au moment du POST, à condition qu’elle ne soit pas déjà passée par le garbage collector.

Je ne maitrise pas suffisamment SPIP pour voir comment faire ça. Mais si ça permet d’atteindre le même objectif (pas de perte d’info pour l’utilisateur, et pas de mauvaise surprise pour le webmestre), pourquoi pas !

Envoyé : Thursday, April 14, 2016 5:14 PM

tu veux dire … laisse sa fenêtre ouverte durant au moins deux jours ?

Oui, exactement, en ayant probablement mis sa machine en veille entre temps.

Euh.... Pas top côté sécurité de retrouver sa session SPIP

Bonsoir,

Pour information, je suis parvenu à ce que je voulais, à savoir afficher un message d’expiration de session, et déconnecter automatiquement l’utilisateur si celui-ci ne clique pas sur le bouton « Rester connecté ». Son mon installation SPIP 3.1.2 (SPIPr, framework Z + Bootstrap 3), ça se fait en 3 étapes :

  1. Modification du script Jquery user Timeout (http://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html) pour désactiver la vérification de présence de bootstrap. Le script ne détecte pas correctement bootstrap pour spip. On remplace les lignes (lignes 94 à 100)

if (options.debug === true) {

window.alert(‹ Twitter Bootstrap 3 was not found! Please load the proper libraries and their themes to utilize this plugin! ›);

} else {

window.console.error(‹ Twitter Bootstrap 3 was not found! Please load the proper libraries and their themes to utilize this plugin! ›);

}

return false;

Par la ligne

uiTest = ‹ bootstrap ›;

  1. Ajout du script Jquery user Timeout dans le fichier squelettes/inclure/head.html

[(#REM) module JQuery pour afficher une fenêtre de timeout pour déconnecter la session de l’utilisateur]

Activation du script dans le squelette squelettes/footer/dist.html

[(#REM) Affichage d’un message indiquant l’expiration de la session quand un utilisateur est connecté]

[(#SESSION{login}|oui)

[(#SET{logout,‹ spip.php?action=logout&logout=public&url= ›})]

[(#SET{logout,[(#GET{logout})][(#SELF|urlencode)]})]

J’ai réglé une expiration à 1h (3600000 millisecondes), soit largement inférieur à la durée de session par défaut de SPIP, et la déconnexion automatique à 10 secondes une fois que le message s’affiche. J’ai du bricoler un peu pour que l’url logout fonctionne correctement (la balise #URL_LOGOUT ne fonctionnait pas dans ce cas). Le message d’intègre parfaitement dans un thème bootstrap (syntaxe modal bootstrap 3). Ce script ne se charge que pour les utilisateurs connectés sur la partie publique du site. Les utilisateurs/admin connectés sur la partie privée ne sont pas concernés.

-Frédéric

bonjour, et merci pour le tuto
je teste avec la même installation il me semble z-core, spip-r, que ce soit bootstrap ou bootstrap3
j’obtiens Twitter Bootstrap 3 was not found! Please load the proper libraries and their themes to utilize this plugin!
bonne journée

Au cas ou ça puisse aider,
voici un filtre que j’ai créé pour se déconnecter, vider le panier, la session et les cookies liés

<?php if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * SPIP action/supprimer_connexion.php * * Anne-lise Martenot * * effacer le panier, le cookie et la session du visiteur * * Usage dans un squelette * * [(#BOUTON_ACTION{<:icone_deconnecter:>,#URL_ACTION_AUTEUR{supprimer_connexion,#SELF,ajax}})] * * **/ function action_supprimer_connexion_dist(){ include_spip('inc/paniers'); // Si on trouve un panier pour le visiteur actuel if ($id_panier = paniers_id_panier_encours()){ $supprimer_panier_encours = charger_fonction('supprimer_panier', 'action/'); $supprimer_panier_encours($id_panier); } include_spip('inc/session'); include_spip('inc/cookie'); $nom_cookie = $GLOBALS['cookie_prefix'].'_panier'; //on efface toute la session avec une valeur numérique ainsi que les cookies if (isset($_COOKIE['spip_session'])) { $session = charger_fonction('session', 'inc'); $session($GLOBALS['visiteur_session']['id_auteur']); spip_setcookie('spip_session', $_COOKIE['spip_session'], time()-3600); spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie], time()-3600); } }

Bonjour Pierre,

C’est le but de l’étape 1 du tuto qui permet de passer outre la vérification de bootstrap 3 dans le script user timeout. Je n’ai pas regardé en détail pourquoi cette vérification échoue sur spip avec le plugin bootstrap 3.

-Frederic

Bonsoir Frederic,

ok j’avais commenté la mauvaise alerte, merci ça fonctionne :wink: