Session et expiration automatique

Session et expiration automatique - PHP - Programmation

Marsh Posté le 21-11-2011 à 16:48:29    

Bonjour,
 
Je suis actuellement en train de développer un intranet qui possède une interface administrateur. L'intégralité de l'intranet se génère dans un page "mère" uniquement grâce à un jeu de condition et d'include.
 
J'ai mis en place des sessions à l'aide de ma basse de données. C'est a dire que j'ai une table "administrateur" comme suit:
 
ID_ADMINISTRATEUR / PSEUDO / PASSWORD / CONNECTION
La colonne connexion est égale à 0 si la personne n'est pas connecté et 1 si elle l'est.
 
Donc, lorsqu'un administrateur essaye de se connecter avec un compte qui est déjà utilisé, l'accès est refusé.  
 
Lorsque la session est inactive trop longtemps, mais que la fenêtre est toujours ouverte, un peu de JavaScript (Trouver sur le web) me permet de la fermer.
 
PAGE : index.html

Code :
  1. <script type="text/javascript" src="script/time_out.js"></script>
  2. <body onmousemove="temps=0" onload='time_out();'>


 
PAGE: time_out.js

Code :
  1. var temps=0;
  2. function time_out()
  3. {
  4. if(temps < 1800)
  5.  temps++;
  6. else
  7.  location.href = "./index.php?account=logout";
  8. setTimeout('time_out()',1000)
  9. }


 
Ce code est fonctionnel.  
 
Cependant, lorsque la personne ferme la fenêtre, le champ "Connection" est toujours sur 1. C'est évident puisqu'il n'y a pas eu de requête SQL pour changer le "1" en "0".
 
Je n'arrive pas a trouver de solution au fait que la personne ferme la fenêtre.
 
Comment faire pour faire expirer la session, en changeant le champ "Connection", si la personne ferme la fenêtre sans passer par ma fonction "Déconnexion" en php ou "Time_out" en JavaScript?
 
Merci d'avance.

Reply

Marsh Posté le 21-11-2011 à 16:48:29   

Reply

Marsh Posté le 22-11-2011 à 08:34:15    

Up matinal!

Reply

Marsh Posté le 22-11-2011 à 11:59:10    

Salut,
 
En gros, en plus du champs connexion qui te permet de savoir si quelqu'un est connecté, il te faudrait un autre champ, un timestamp, qui t'indique la dernière fois que tu as vu cette personne.
 
A chaque fois que quelqu'un affiche une page, tu mets à jour cette données.
 
D'un autre côté, il te faut une tache type "cron", qui s’exécute par exemple toutes les 5 minutes, et qui va déconnecter automatiquement les gens qui sont indiqué comme connecté mais qui n'ont pas affiché de page depuis par exemple 5 minutes ou 10 minutes ou ce que tu veux, c'es toi qui choisi. Il te suffit de faire passer leur champ connection à 0 et voilà, même si la personne n'est pas passé par ta couche javascript pour se déconnecter, elle sera déconnectée après quelques minutes.


---------------
Mon Feedback !
Reply

Marsh Posté le 22-11-2011 à 13:51:04    

La solution est de Tirkyth est bonne. Sinon, une autre : sur unload, tu mets un js qui sera appelé et qui enverra une requête ajax à ton serveur pour mettre à 0 la connexion ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-11-2011 à 14:30:31    

Tiens Rufo, petite question pour toi :

 

Je n'ai jamais été fan du unload car j'ai du mal à imaginer le comportement du navigateur.
Dans ce cas précisément, en considérant que l'url appelée pour mettre à 0 le champ connexion prenne 30 secondes à envoyer une réponse, comment se comporte le navigateur lorsque je le ferme (avec la croix en haut de la fenêtre) ?

 

D'après ce que tu indiques, il va donc exécuter le javascript associé à l'évènement unload. C'est fiable ? Genre ça fonctionne à 100% ?
Vu que la réponse va arriver seulement 30 secondes après, pendant 30 secondes il attend avant de se fermer ou il se ferme et se fou de la réponse ?

 

Merci à toi si tu peux m'en dire un peu plus. Je n'ai jamais osé faire confiance à cet évènement unload, mais il n'est pas trop tard pour changer d'avis ^^

 

Edit : Et sinon juste pour appuyer ma solution un peu plus : Si le navigateur crash, là par contre le  unload ne sera pas appelé. Du coup, appliquer les deux solutions serait finalement l'idéal non ? Le javascript serait utilisé pour ceux qui ferment leur navigateur normalement, puis dans le cas ou quelqu'un a son ordi qui crash, la tache cron que je suggère pourrait nettoyer les cas non traités par le javascript.


Message édité par Tirkyth le 22-11-2011 à 14:32:34

---------------
Mon Feedback !
Reply

Marsh Posté le 22-11-2011 à 14:49:01    

Pour unload, jamais fait de tests... Mais implémenter les 2 solutions n'est pas incompatible. Je pense malgré tout que ta solution est plus globale, donc pas la peine de se prendre la tête à faire les 2 ;) Si j'ai proposé la solution unload, c'est pour qu'il ait le choix.


Message édité par rufo le 22-11-2011 à 14:49:39

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-11-2011 à 13:57:46    

Bonjour,  
 
Je vous remercie d'avoir répondu. C'est vraiment gentil!
 
Tirkyth, ton idée me parait très bonne. Je pense donc allé vers celle-ci!
 
Mais comment faire pour créer une tache de type "cron"?
 
Peux tu développer un peu plus cette petite bete, qui a l'air merveilleuse!
 
Merci d'avance!

Reply

Marsh Posté le 23-11-2011 à 14:16:31    

"cron" en fait c'est un programme disponible sur les environnements unix/linux qui permet d’exécuter quelque chose de façon régulière.
 
Ce que j'appelle "tâche cron" donc, c'est juste un fichier PHP, qui sera executé par "cron" toutes les 5 minutes par exemple dans ton cas. Et ce fichier, il irait juste regarder dans la base de données les gens qui sont indiqués comme connectés mais qui n'ont pas affiché de page depuis 10 minutes, pour les déconnecter.
 
Il faut bien évidemment pour pouvoir faire ça t'assurer que tu as un bon contrôle sur le serveur sur lequel ton application ou site sera hébergé. Souvent, sur les hébergements mutualisés, il n'est pas possible de mettre en place ce genre de choses.


---------------
Mon Feedback !
Reply

Marsh Posté le 23-11-2011 à 14:28:31    

Pour info, y'a des "web-cron", des sites qui proposent plus ou moins gratuitement d'exécuter des scripts php périodiquement...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-11-2011 à 14:53:32    

Super! Je comprend très bien!
 
Je vais voir ça avec la société pour laquelle je travaille!
 
Je vous tiendrai au courant de la réussite du projet!

Reply

Marsh Posté le 23-11-2011 à 14:53:32   

Reply

Marsh Posté le 25-11-2011 à 16:33:10    

Bonjour!
 
Alors j'ai essayé de configurer le "crontab" de mon serveur!
 
Mais je ne peux pas savoir si il marche ou pas car mon script est bugué!
 
Lorsque j’exécute mon script avec avec la commande "php time_out.php", je recois l'erreur :
 
PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in line Unknown on line 0.
 
J'ai regardé mon php.ini est "register_globals" est a "off" en "Local value" mais a "on" en "Master value".
 
Et mon script ne veux pas s’exécuter!
 
Pouvez-vous encore m'aider s'il vous plait?

Reply

Marsh Posté le 25-11-2011 à 16:38:20    

Au passage voici mon script:
 

Code :
  1. /*Script de verification des connections inactives*/
  2. try
  3. {
  4.  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
  5.  $bdd = new PDO('mysql:host=localhost;dbname=intranet', 'root', '', $pdo_options);
  6.  $reponse = $bdd->query("SELECT time_out, id_utilisateur AS id FROM utilisateur WHERE connection = '1'" );
  7.  $utilisateur = $reponse->fetchAll(PDO::FETCH_OBJ);
  8.  $reponse->closeCursor();
  9.  $step = time();
  10.  foreach ($utilisateur AS $u)
  11.  {
  12.   if ($u->time_out <= $step)
  13.   {
  14.    $reponse = $bdd->prepare("UPDATE utilisateur SET connection = '0', time_out = '0' WHERE id_utilisateur = :id" );
  15.    $reponse->execute(array('id' => $u->id));
  16.    $reponse->closeCursor();
  17.   }
  18.  }
  19.  unset($step);
  20.  unset($utilisateur);
  21. }
  22. catch (Exception $erreur)
  23. {
  24.  die ('Impossible d\'executer le script de vérification.');
  25. }

Reply

Marsh Posté le 28-11-2011 à 08:02:15    

Up ?!

Reply

Marsh Posté le 28-11-2011 à 14:30:46    

T'es sûr d'avoir modifié le bon php.ini, celui effectivement chargé utilisé?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-11-2011 à 17:20:56    

Pas besoin de cron je pense, il suffit que tu lance ton traitement pendant la validation du login... Ça sera de toutes façons très court (d'autant que tu peux tout faire en une seule requête SQL...) en traitement...


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 02-12-2011 à 14:57:08    

J'ai trouvé la solution.  
 
Dans le "php.ini", dans le commentaire des "register_globals", ils disent qu'ils traite ça dans un autre fichier.
 
C'est la bas qu'il faut allez voir!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed