Php+js comment limiter 1 session par login

Fermé
oscarapace Messages postés 56 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 19 juin 2009 - 2 avril 2009 à 10:19
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 - 2 avril 2009 à 15:00
Bonjour,

Je voudrais limiter l'utilisation d'un compte sur un site. Cad que 1 seule personne puisse utiliser le même login au même moment.
La première solution consiste à utiliser l'adresse IP, seulement plusieurs personnes différentes peuvent avoir la même IP (réseau entreprise par exemple, proxy commun, etc.). Donc ce n'est pas suffisant.

Mon problème est que si j'interdis le login si ce login a déjà une session ouverte ça peut bloquer : si l'utilisateur a quitté le site sans faire de "log out", on croit qu'il est toujours connecté, au moins pendant la durée de validité de la session (par ex 30 minutes). Dans ce cas si il a fermé son navigateur sans faire de log out et retente de se connecter, il sera bloqué pendant un temps trop long.

Je crois qu'en JS on peut détecter la fermeture de la fenetre : faire un log out si l'utilisateur ferme le navigateur. Mais d'après mes souvenirs ce n'est pas très fiable.

La seule solution que j'entrevois est d'utiliser ajax pour signaler toutes les X secondes que la session est ouverte. Dans ce cas si l'utilisateur quitte le site sans faire de log out, on aura plus le signal par ajax donc on ferme la session.

Quelqu'un a de l'expérience ou une idée sur ce sujet ?

Merci !

3 réponses

Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
2 avril 2009 à 10:37
j'ai une vague idée, avec ta solution ajax (ou lors du chargement d'une nouvelle page)

lorsque l'utilisateur se log, sa session va créer une valeur aléatoire (random) qui sera stockée dans $_SESSION['unique_login'], et dans la base de données. La base de données contiendra les dernieres valeurs de cette variable

lors du chargement d'une nouvelle page, on vérifie que le unique_login soit bien le dernier crée.. si c'est pas le cas, tu supprime la session et affiches un message "vous vous etes conencté depuis un autre ordinateur"
0
oscarapace Messages postés 56 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 19 juin 2009 14
2 avril 2009 à 11:30
je ne vois pas ce que cela change.

exemple :

A se connecte sur le site. il consulte qq pages et ferme son navigateur sans faire de log out.

A réouvre le site et veut se connecter, au pire il a même changé de poste de travail. le uniq_id a changé, donc ça le bloque ???
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
2 avril 2009 à 11:47
non, mais ca ferme la première session qu'il utilisait , et le laisse uniquer uniquement la 2°

et ca lui met "vous venez de vous conencter depuis un autre poste


sinon, si tu veux empecher une nouvelle conenxion, dans la table "utilisateurs" de ta bdd, tu met un champs dernière activité, que tu met a jour a chaque chargement de page, et genre toutes les 15 secondes grace a ajax
->lors du login, tu vérifie dans la bdd qu'il a pas eu d'activité dans les 15 dernières secondes !

cete solution empèche une nouvelle connexion, l'autre solution permetait de fermer automatiquement les anciennes connexions... 2 philosophies différentes
au choix: message vous etes deja connecté depuis un autre ordi
ou, vous venez de vous connecter sur un autre ordi

pour la bdd, je préconise l'usage d'une table en mémoire (pas enregistrée sur le disk) pour ne pas ralentir le serveur
0
oscarapace Messages postés 56 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 19 juin 2009 14
2 avril 2009 à 11:59
oui je pense retenir la solution ajax pour ne pas fermer la première session mais empecher l'ouverture d'une deuxième session, sans bloquer qq'un qui ferme son navigateur et revient (mis à part une attente de 10 secondes du fait du signal ajax).

je crois qu'on peut aussi utiliser json et écrire une balise script js dans le header de façon transparente, ce qui a pour effet de lancer une requete au site sans passer par des fonctions ajax qui ne sont peut etre pas toujours compatibles, en plus ces requetes sont moins visibles.

merci
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
2 avril 2009 à 13:44
pour le JS, je connais pas trop, je ne développe pas trop de sites (je le ferai si j'étais bon en design ;) et le html/css ca me prend la tete.. surtout pour les compatibilités inter navigateurs...
0
oscarapace Messages postés 56 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 19 juin 2009 14 > Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014
2 avril 2009 à 14:59
il suffit de récupèrer jsr_class.js qui ne fait que quelques lignes.

ensuite dans un script il suffit de mettre ces qq lignes pour envoyer une requete :

var req = 'http://url_de_ma_requete'
jsreq = new JSONscriptRequest(req);
jsjreq.buildScriptTag();
jsreq.addScriptTag();

l'avantage est que ca marche sur tous les navigateurs et que la requete peut aller sur un autre domaine, par contre c'est asynchrone et ce n'est pas idéal si on doit récupérer des infos par la requete
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193 > oscarapace Messages postés 56 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 19 juin 2009
2 avril 2009 à 15:00
pas grave, ta requete servira juste de watchdog ...
0