une connexion par personne?

Eléphant du PHP | 108 Messages

11 sept. 2006, 14:59

Bonjour,

j'aimerais savoir si c'est possible par les sessions que 2 postes differents se connectent avec le meme login!

ex:
login: toto
connexion de toto sur poste 1 et connexion de toto sur poste 2.

J'aimerais qu'il soit impossible que toto se connecte sur 2 postes differents!

J'ai peut etre une solution en passant par la base de donnee! En mettant a 1 un champ de la table quant il y a connexion de toto, et si il essai de se reconnecter sur un poste sans etre deconnecter du poste 1, il y a verification pour savoir si il n'est pas deja connnecte en regardant le champ si il n'est pas a 1 (donc connecte).

J'essai donc de savoir si c'est possible de le fair rien qu'en passant dans les sessions?

Merci de votre aide!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 sept. 2006, 15:41

Cette idée n'est pas mauvais mais le soucis vient du fait qu'il est très difficile de détecter la déconnexion.

Si la durée de vie de tes session est de 2h, il est possible que quelqu'un qui se déconnecte du boulot, rentre chez lui et se reconnecte puisse se voir l'accès refusé alors qu'il n'est connecté en réalité qu'une seule fois ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 108 Messages

11 sept. 2006, 16:03

y aurait-il d'autres solutions pour qu'il n'existe qu'une connexion par login a un instant T?

Mammouth du PHP | 684 Messages

12 sept. 2006, 01:08

Salut.
Peut-être en couplant ta solution avec du javascript.
Tu fais un petit script qui te confirme que tu es toujours connecté sur ton site.
Si le navigateur se ferme sans clic sur le lien deconnexion, alors dans ta base
tu aura peut etre une date que ne se mettra pas a jour.
Dans ce cas, si tu fais une vérification toutes les 5 minutes et que dans ta base la date dépasse ces 5 minutes alors tu peux considérer que la personne est encore connectée.
Attention tout de même aux personnes qui laisse leurs navigateurs ouverts en partant du boulot. Tu risque d'avoir un problème dans ce cas la.
Peut être en considérant que tout le monde part à environ la même heure du travail, tu puisse dire ou supposer qu'elles se reconnectent de chez elles.
Zigz4g

Eléphant du PHP | 332 Messages

12 sept. 2006, 09:40

Par défaut, la durée de vie d'une session est de 20 minutes. C'est-à-dire que chaque fois que l'utilisateur fait une action, la session est réactivée pour 20 minutes. C'est comme cela que tu peux vérifier que les utilisateurs ont quitté ton site sans se déconnecter (au bout de 20 minutes seulement).

Voila comment je gère le problème pour un Intranet :

- Après vérification réussie du code et du mot de passe de l'écran de login, je stocke l'identifiant de session dans une variable de session.
$_SESSION["SESSION_ID"] = session_id();
- Sur le bouton de déconnexion (ça arrive parfois, des utilisateurs qui se déconnectent), je remet cet identifiant de session à null et je réafffiche la page de login avec un message du type "déconnexion effectuée".

- Sur toutes les pages du site, dans le code HTML, je fais un refresh de la page vers la page de login avec un message "session fermée" au bout d'une demi-heure.

Code : Tout sélectionner

<meta http-equiv="Refresh" content="1800;url=index.php?action=timeout">
Tout comme le cas où l'utilisateur se déconnecte, l'action timeout remet l'identifiant de session à Null et réaffiche la page de login (seul le message d'information est différent).

Mais il y a également le cas où, par exemple, l'utilisateur a ouvert une boîte pour uploader un fichier. Dans ce cas le refresh ne fonctionne pas. Plus d'autres cas où, sans raison, le refresh ne se déclenche pas. Donc, dans toutes les pages du site, avant de faire quoique ce soit, je vérifie si l'identifiant de session stocké est bien égal à l'identifiant de session actif et sinon, encore une fois, je redirige vers le time-out si la session a expiré.
if ($_SESSION["SESSION_ID"] != session_id()) {
	header ("Location: index.php?action=timeout"); exit();
}
Si tu veux savoir qui est connecté ou pas, il te reste à coupler l'enregistrement de la variable de session ou sa mise à null avec des enregistrements dans une base de données.

Eléphant du PHP | 108 Messages

12 sept. 2006, 12:00

Merci de ta reponse tres instructive :D

mais c'est quoi la difference entre "session.cache_expire" et "session.gc_maxlifetime"?
:?

Eléphant du PHP | 332 Messages

12 sept. 2006, 12:15

Aucune idée. J'ai toujours laissé les paramètres par défaut.

session.gc_maxlifetime Spécifie la durée de vie des données sur le serveur, en nombre de secondes. Après cette durée, les données seront considérées comme obsolètes, et supprimées.
En anglais : session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up. Garbage collection occurs during session start.
Par défaut : 1440 secondes soit 24 minutes.

session.cache_expire Spécifie la durée de vie des données de sessions, en minutes. Cette option n'a aucune conséquence sur le contrôle de cache. Par défaut, il vaut 180 (3 heures).
session.cache_expire specifies time-to-live for cached session pages in minutes, this has no effect for nocache limiter. Defaults to 180.

En anglais, l'explication ne parle pas de données de session, mais de pages ! Et l'unité des données n'est pas spécifiée.

par contre, les valeurs données remettent en cause mes idées sur une durée de 20 minutes !!!

Eléphant du PHP | 108 Messages

12 sept. 2006, 12:40

c'est pour ca que je t'ai pose la question, j'arrivais pas avoir la correspondance des 20 min :wink:

Eléphant du PHP | 332 Messages

12 sept. 2006, 13:13

Ce serait donc peut-être 24 minutes d'inactivités qui remettent à null ma valeur $_SESSION["SESSION_ID"] et qui donc provoque le retour en page de login.

Mais je ne vois pas l'intérêt de garder les données 24 minutes et les pages 3 heures. La différence de temps est franchement disproportionnée.

Si un expert des sessions passe par ici, ses explications sont les bienvenues.

Eléphant du PHP | 108 Messages

12 sept. 2006, 14:00

j'ai un autre petit probleme :?

dc dans ma base, je met un champ a 1 si il est connecte, et chaque page je calcul la difference de ce temps mis a jour a chaque page au temps de "maintenant", si la diffrence est superieur a 3600 sec, il deconnecte la personne en passant le champs a 0.

Mais si la personne ferme son navigateur la requete ne sera jamais executer!
et donc si il revien sur la page de connexion le champs sera toujours a 1!

comment faire quand il revient sur la page de connexion que ce chmps vienne a 0?

Eléphant du PHP | 332 Messages

12 sept. 2006, 14:19

Si tu as une base de données sur laquelle tu peux lancer des tâches programmées (type Oracle), tu fais une fonction qui se lance régulièrement et qui vide les connexions supérieures à 3600.

Sinon tu écris un script PHP qui va faire la même chose et que soit tu peux lancer dans la crontab Linux (ou le gestionnaire de tâches Windows) du serveur, soit faire exécuter à intervalles réguliers par www.webcron.org

Eléphant du PHP | 108 Messages

12 sept. 2006, 14:24

je travaille sous mysql, la fonction qui dit si il y a une difference de plus de 3600 , je met a 0 le champ dans la base est deja fait. elle fonctionne tres bien et j'en suis fier :D :wink: !

mais le probleme c'est qu'il n'y pas de mise a jour qui se fera si la personne ferme son navigateur.

Eléphant du PHP | 332 Messages

12 sept. 2006, 14:37

Non, il n'y a pas de moyen d'obliger la personne à se déconnecter. La seule solution est donc de structer régulièrement la base (toutes les 5 minutes par exemple) et de virer toutes les connexions inactives depuis 1 heure.

En fait, si, il y a un moyen de faire, mais il est assez inélégant.
Tu mets en place sur toutes tes pages un script qui se déclenche sur la fermeture du browser (événement onclose à mettre sur le body). Sur cette fermeture, tu rediriges l'internaute vers une page de déconnexion.

Eléphant du PHP | 108 Messages

12 sept. 2006, 14:52

merci a toi Henry, on peut dire que mainteant que ce post est clos et resolu!

Merci encore!

Eléphant du PHP | 108 Messages

12 sept. 2006, 14:55

donc la restrucutuation passe par la mise en place du gestionnaire de tâches de windows pour faire ca toute les x min?