Controler la connexion a mon application
Résolu
cyrilherve
Messages postés
327
Statut
Membre
-
Nabla's Messages postés 20731 Statut Contributeur -
Nabla's Messages postés 20731 Statut Contributeur -
salut a tous ,
je travail sur un application de gestion de courier en ligne. pour l'acces j'ai cree un table USERS dans Mysql ou est stocke les login et password des differents utilisateurs. j'ai eglament utilise les variables sessions pour les connexions , donc je recupere les loggin et password dans des variables session apres chaque session.
mon probleme est le suivant: jusqu'ici plusieurs utilisateurs peuvent se connecter avec le mm compte. comment je peux remedier a ça ?? du genre avant chaque connexion , le systeme s'assure d'abord que le compte n'est pas deja utilise par une autre personne... est ce que quelqun a un script qlque part qui peut m'aider ??
merci a vous ....
je travail sur un application de gestion de courier en ligne. pour l'acces j'ai cree un table USERS dans Mysql ou est stocke les login et password des differents utilisateurs. j'ai eglament utilise les variables sessions pour les connexions , donc je recupere les loggin et password dans des variables session apres chaque session.
mon probleme est le suivant: jusqu'ici plusieurs utilisateurs peuvent se connecter avec le mm compte. comment je peux remedier a ça ?? du genre avant chaque connexion , le systeme s'assure d'abord que le compte n'est pas deja utilise par une autre personne... est ce que quelqun a un script qlque part qui peut m'aider ??
merci a vous ....
A voir également:
- Controler la connexion a mon application
- Gmail connexion - Guide
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Desinstaller application windows - Guide
- Site inaccessible n'autorise pas la connexion - Guide
- Application pour voir qui regarde mon profil facebook gratuit - Guide
18 réponses
i have a solution, but you will have to develop it by yourself.
when user connectes, you register it's ip, and time of last action of the site. If it's IP changes too fast, this mean 2 persons are connected.
you can also add more safety by putting a cookie on it's computer
when user connectes, you register it's ip, and time of last action of the site. If it's IP changes too fast, this mean 2 persons are connected.
you can also add more safety by putting a cookie on it's computer
bon, on va se la faire en francais pour que d'autres puissent aider aussi ;)
j'ai meme une meilleure idée que ce que je t'ai dit.
lorsque le client se log sur le site, tu génères un nombres aléatoire (plus il est grand, mieux c'est). A la limite, tu peux faire un hashage md5 du nom de client, de son ip, de l'heure, et meme d'une donnée aléatoire.
tu enregistres cette valeur dans la session ($_SESSION[]) et dans un champs de ta base de données (dans la table utilisateurs par exemple).
A chaque chargement de page du client, tu vérifies que la valeur dans la session est bien la meme que dans la bdd. Si c'est la meme, alors le client est toujours le meme, tu lui donne la page demandé. Si la valeur n'est pas la meme, alors il s'est loggué depuis un autre ordinateur: il faut lui demander de se re logguer. A la limite, tu peux meme du coup changer la valeur dans la base de données pour que meme le 2° client soit kiké !
j'ai meme une meilleure idée que ce que je t'ai dit.
lorsque le client se log sur le site, tu génères un nombres aléatoire (plus il est grand, mieux c'est). A la limite, tu peux faire un hashage md5 du nom de client, de son ip, de l'heure, et meme d'une donnée aléatoire.
tu enregistres cette valeur dans la session ($_SESSION[]) et dans un champs de ta base de données (dans la table utilisateurs par exemple).
A chaque chargement de page du client, tu vérifies que la valeur dans la session est bien la meme que dans la bdd. Si c'est la meme, alors le client est toujours le meme, tu lui donne la page demandé. Si la valeur n'est pas la meme, alors il s'est loggué depuis un autre ordinateur: il faut lui demander de se re logguer. A la limite, tu peux meme du coup changer la valeur dans la base de données pour que meme le 2° client soit kiké !
tout a fait ,,, mais pour mon cas , le but est d'empecher deux personnes de se connecter avec le mm compte (on est d'accord qu'il peut arriver qu'un utilisateur ai le login et le pwd d'un autre mm par tricherie) et tu conviens avc moi qu'avec cette solution, a chaque fois qu'un va se connecter il va deconnecter l'autre ,,,,,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
je ne comprends pas ce que tu veux dire par :
on est d'accord qu'il peut arriver qu'un utilisateur ai le login et le pwd d'un autre mm par tricheriePour moi, si c'est le meme login et le meme mot de passe, alors c'est le meme compte. D'ailleurs je mettrai meme le login en tant que clef primaire de la table ....
je m'explique : imagine que tu as ton login (qui est biensur unique dans la bd) et qu'un jour par negligeance ça me tombe sur les mains( avec ton passe biensur), est ce que oui ou non je vais me connecter avec au systeme.
je crois que 'oui' si aucune disposition n'est prise. et c la mon objectif : empecher que le mm compte soit utise au mm moment sur des postes differents,,,, et je crois que ta premiere reponse allait dans ce sens ...
mon probleme par rapport a cette reponse etait de savoir comment derterminer et recuperer le tps de la derniere action sur le navigateur ,,,,
je crois que 'oui' si aucune disposition n'est prise. et c la mon objectif : empecher que le mm compte soit utise au mm moment sur des postes differents,,,, et je crois que ta premiere reponse allait dans ce sens ...
mon probleme par rapport a cette reponse etait de savoir comment derterminer et recuperer le tps de la derniere action sur le navigateur ,,,,
avec la 2° solution, quadn un 2° gars se connecte, le gars qui était connecté avant a sa session qui se termine, avec un message du genre "vous venez de vous connecter depuis un autre poste".
avec la première solution, c'est l'inverse: ca dit "vous êtes déja connecté depuis un autre poste".
je crois que j'avais déjà approfondi le sujet avec un gars, mais il y a un moment (entre fevrier et juin)... tu peux essayer de chercher dans l'historique de mes discutions, mais tu risques d'en avoir pour un moment !
dis moi quel fonctionnement tu souhaite lors d'une 2° connexion: qui doit rester connecté ?
avec la première solution, c'est l'inverse: ca dit "vous êtes déja connecté depuis un autre poste".
je crois que j'avais déjà approfondi le sujet avec un gars, mais il y a un moment (entre fevrier et juin)... tu peux essayer de chercher dans l'historique de mes discutions, mais tu risques d'en avoir pour un moment !
dis moi quel fonctionnement tu souhaite lors d'une 2° connexion: qui doit rester connecté ?
j'ai des solutions mais ca va prendre des ressources....
tu rajoutes un champ (dernière fois vu)dans la table utilisateurs
à chaque fois que la personne charge une page, tu vérifies que l'identifiant dont je te parlait en (5), et tu changes stoques dans la BDD la derniere fois que cet identifiant a donné signe de vie.
lors de la demande de connexion, tu vérifies que la personne n'ai pas ouvert donné signe de vie récement. Si il a télécahrgé depuis pas longtemps, tu refuses la connexion. Sinon, tu autorises. (penser à mettre un systeme de déconnexion sur le site, si la personne change de navigateur ou d'ordinateur)
encore mieux: un script en ajax dans toutes tes pages qui envoie toutes les 30 secondes un "keepalive"-> update du champs "dernière fois vu". Lors d'une 2° connexion, vérification qu'il n'y a pas eu de keepalive depuis une minute par exemple. Si il y en a eu un: on refuse,; si il n'y en a pas, tu crées la nouvelle conenxion.
je pense que je vais essayer de faire un petit bout de code pour cette partie ce week end, et poster une astuce, car visiblement, beaucoup de personnes se demandent comment faire ca.
dans tout les cas, n'hésites aps à me redemander si je ne le fais pas, ou a poster ton code si tu le fais avant moi !
tu rajoutes un champ (dernière fois vu)dans la table utilisateurs
à chaque fois que la personne charge une page, tu vérifies que l'identifiant dont je te parlait en (5), et tu changes stoques dans la BDD la derniere fois que cet identifiant a donné signe de vie.
lors de la demande de connexion, tu vérifies que la personne n'ai pas ouvert donné signe de vie récement. Si il a télécahrgé depuis pas longtemps, tu refuses la connexion. Sinon, tu autorises. (penser à mettre un systeme de déconnexion sur le site, si la personne change de navigateur ou d'ordinateur)
encore mieux: un script en ajax dans toutes tes pages qui envoie toutes les 30 secondes un "keepalive"-> update du champs "dernière fois vu". Lors d'une 2° connexion, vérification qu'il n'y a pas eu de keepalive depuis une minute par exemple. Si il y en a eu un: on refuse,; si il n'y en a pas, tu crées la nouvelle conenxion.
je pense que je vais essayer de faire un petit bout de code pour cette partie ce week end, et poster une astuce, car visiblement, beaucoup de personnes se demandent comment faire ca.
dans tout les cas, n'hésites aps à me redemander si je ne le fais pas, ou a poster ton code si tu le fais avant moi !
treb bien ça marche ,,, donc je continu a fouiller et si je trouve avant je poste ( mais qd mm !!! je suis dessus depuis 3 jrs, j'ai deja presque tout tenté ,,, peut etre j'aurais un coup de grace cette fois ci )
ps: voici une piste que j'ai u en fouillant,,,, tu poura jetter un coup d'oeil et me dire ce que tu en pense
..... pourquoi ne pas ajouter dans ta table users, un champ 'derniere activitee', un champ 'online' (et un champ ip)
s'il ne n'a pas clique sur un lien 'log out' et si la derniere activitee date de plus de 5 min (par exemple) tu consideres qu'il a timeout et tu autorise la connexion sur un autre pc.....
il precise a la suite il precise:
...... au debut de chaque page, tu peux tester ca :
* si tes variables de session n'existent pas, tu redirige vers la page de connexion
* si la variable de session de timeout n'existe pas, tu l'initialise avec la valeure de la BDD
* si la valeure du timeout > "maintenant + X minutes", tu passe la valeur du 'online' a zero; et tu redirige vers la page de connexion
* si tous les tests ont ete passes, tu mets a jour le timeout dans la BDD
.....
ps: voici une piste que j'ai u en fouillant,,,, tu poura jetter un coup d'oeil et me dire ce que tu en pense
..... pourquoi ne pas ajouter dans ta table users, un champ 'derniere activitee', un champ 'online' (et un champ ip)
s'il ne n'a pas clique sur un lien 'log out' et si la derniere activitee date de plus de 5 min (par exemple) tu consideres qu'il a timeout et tu autorise la connexion sur un autre pc.....
il precise a la suite il precise:
...... au debut de chaque page, tu peux tester ca :
* si tes variables de session n'existent pas, tu redirige vers la page de connexion
* si la variable de session de timeout n'existe pas, tu l'initialise avec la valeure de la BDD
* si la valeure du timeout > "maintenant + X minutes", tu passe la valeur du 'online' a zero; et tu redirige vers la page de connexion
* si tous les tests ont ete passes, tu mets a jour le timeout dans la BDD
.....
https://www.developpez.net/forums/d807880/php/langage/controler-connexion-application/#post4654211
et la tout coe chz toi il faut recuperer le tps et comparer le temps de la derniere action....
et la tout coe chz toi il faut recuperer le tps et comparer le temps de la derniere action....
bon, j'ai fait quelques tests.
je t'invite à regarder ces scripts (attention, c'est juste un "proof of concept")
script sql de création de la table de tests:
mon utilisateur s'appelle nablas et il n'y a pas de vérification de password à faire
fichier connexion_bdd.php
fichier index.php (ou.html ca change rien)
fichier keepalive.php (appellé par le script javascript de traitement: tant qu'une page du site est ouvert, il envoie un signal disant que la session est toujours active)
et pour finir, le fichier traitement.php
je suis sur que certains trouveront plein de choses à redit à ce script, comme quoi il n'est pas complet, pas fini de ch*é, mias c'est normal, c'est juste une démo. Je les invite à le corriger quand je le publierai
fonctionnement: tu ouvres le scipt dans un premier navigateur (IE), tu connectes, ok, tout se passe bien.
tu ouvres firefox, tu esssayes de te connecter alors que la session IE est tjs ouverte: ca coince. Tu fermes IE, tu retentes de te connecter avec firefox, ca passe.
j'ai fait l'autre version du script, celle qui déconnecte la première personne, mais je la posterai quand le publierai dans la FAQ
je t'invite à regarder ces scripts (attention, c'est juste un "proof of concept")
script sql de création de la table de tests:
CREATE TABLE IF NOT EXISTS `users` ( `login` varchar(15) NOT NULL, `password` varchar(15) NOT NULL, `keep_alive` int(11) NOT NULL, `ID_client_md5` varchar(32) NOT NULL, PRIMARY KEY (`login`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
mon utilisateur s'appelle nablas et il n'y a pas de vérification de password à faire
fichier connexion_bdd.php
<?php
$host = 'localhost'; //serveur mysql
$user = 'root'; //login
$passwd = ''; //mot de passe
$bdd = 'test_users'; //nom de la base de données
// Connexion au serveur
mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");
mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");
?>
fichier index.php (ou.html ca change rien)
<html> <body> <form method=POST action="traitement.php"> login: <input name="login" value="nablas"/> <input type="submit" /> </form> </body> <a href="test.php">test</a> </html>
fichier keepalive.php (appellé par le script javascript de traitement: tant qu'une page du site est ouvert, il envoie un signal disant que la session est toujours active)
<?php session_start();
include("connexion_bdd.php");
$timestamp = time();
mysql_query("UPDATE `users` SET `keep_alive` = $timestamp WHERE `login` like \"$_SESSION[login]\"");
?>
et pour finir, le fichier traitement.php
<?php session_start();?>
<html>
<script type="text/javascript">
Ajax();
function Actualise(){}
function Ajax(){
setInterval("Ajax()", 2000 ); //prochaine actualisation
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
{ // Autre
alert("pas d'AJAX");
return;
}
xhr_object.open("POST", "keepalive.php", false);
xhr_object.send(null);
xhr_object.onreadystatechange = Actualise();
}
</script>
<body>
<?php
include('connexion_bdd.php');
$login= $_POST['login'];
//adresse IP de l'hote
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$IP = $_SERVER['HTTP_X_FORWARDED_FOR'];
elseif(isset($_SERVER['HTTP_CLIENT_IP']))
$IP = $_SERVER['HTTP_CLIENT_IP'];
else $IP = $_SERVER['REMOTE_ADDR'];
// Creation et envoi de la requete
$result = mysql_query("SELECT * FROM users WHERE login='$login';");
if($objet = mysql_fetch_object($result))
{
if ( ($objet->keep_alive) + 10 < time())
{
$md5 = md5($login.time().$IP); //petit identifiant perso
$_SESSION['ID_client_md5']=$md5; //enregistrement de l'identifiant perso dans la session
$_SESSION['login']=$login;
//enregistrer l'identifiant perso dans la BDD
mysql_query("UPDATE `users` SET `ID_client_md5` = '$md5' WHERE `login` like '$login'");
echo "vous êtes bien connectés";
}
else
{
echo "une session est déja ouverte sur un autre poste";
unset($_SESSION['login']);
}
}
?>
</body>
<html>
je suis sur que certains trouveront plein de choses à redit à ce script, comme quoi il n'est pas complet, pas fini de ch*é, mias c'est normal, c'est juste une démo. Je les invite à le corriger quand je le publierai
fonctionnement: tu ouvres le scipt dans un premier navigateur (IE), tu connectes, ok, tout se passe bien.
tu ouvres firefox, tu esssayes de te connecter alors que la session IE est tjs ouverte: ca coince. Tu fermes IE, tu retentes de te connecter avec firefox, ca passe.
j'ai fait l'autre version du script, celle qui déconnecte la première personne, mais je la posterai quand le publierai dans la FAQ
bjr, de retour aprs une longue absence !!!!
ecout tes scripts ont parfaitement resolu mon probleme, oouuuf !!!!
le script Ajax-jscript est magic !!! mon probleme du navigateur qui arrete la session aprs un tps
d'inaction ne se pose plus du tout: keepalive est reactualise tte les 30 min,,,, vraiment bien pensé.
merci encore ,, vivement qu'on ai la version ou le premier user est deconnecté (pour la biblio surtout ...)
je suis en veille et j'ai hate de le tester.
PS: juste un truc: j'ai pas compris a quoi sert l'adresse ip recupere :
//adresse IP de l'hote
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$IP = $_SERVER['HTTP_X_FORWARDED_FOR'];
elseif(isset($_SERVER['HTTP_CLIENT_IP']))
$IP = $_SERVER['HTTP_CLIENT_IP'];
else $IP = $_SERVER['REMOTE_ADDR'];
A tres bientot.
ecout tes scripts ont parfaitement resolu mon probleme, oouuuf !!!!
le script Ajax-jscript est magic !!! mon probleme du navigateur qui arrete la session aprs un tps
d'inaction ne se pose plus du tout: keepalive est reactualise tte les 30 min,,,, vraiment bien pensé.
merci encore ,, vivement qu'on ai la version ou le premier user est deconnecté (pour la biblio surtout ...)
je suis en veille et j'ai hate de le tester.
PS: juste un truc: j'ai pas compris a quoi sert l'adresse ip recupere :
//adresse IP de l'hote
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$IP = $_SERVER['HTTP_X_FORWARDED_FOR'];
elseif(isset($_SERVER['HTTP_CLIENT_IP']))
$IP = $_SERVER['HTTP_CLIENT_IP'];
else $IP = $_SERVER['REMOTE_ADDR'];
A tres bientot.
l'ip c'était pour personailiser un peu plus l'identifiant .. c'est pas indispensable. Si ca se trouve, je l'avais plutot mis là pour l'autre script que j'avais fait avant
j'avais oublié que j'avais dis que je publierai l'autre solution.
il faut quand meme que je rende le code plus propre pour pouvoir le mettre dans les astuces (sinon il y a plein de programmeurs "chevronnés" ou casse bonbon qui vont raler ;)
n'hésites pas à me relancer si j'oublie de mettre l'autre solution
j'avais oublié que j'avais dis que je publierai l'autre solution.
il faut quand meme que je rende le code plus propre pour pouvoir le mettre dans les astuces (sinon il y a plein de programmeurs "chevronnés" ou casse bonbon qui vont raler ;)
n'hésites pas à me relancer si j'oublie de mettre l'autre solution
hey !!!! salut ,, c encore moi
est ce que le deuxieme script est deja disponible ? celui qui deconnecte le premier utilisateur quand un deuxieme se connecte avec le meme compte que lui.
juste pr te rappeler, don't forget us please !!!!
thanks
est ce que le deuxieme script est deja disponible ? celui qui deconnecte le premier utilisateur quand un deuxieme se connecte avec le meme compte que lui.
juste pr te rappeler, don't forget us please !!!!
thanks
tu fais biend e me rapeller. il est disponible depuis longtemps, mais sur mon ordi ;) il faut que je pense à le poster ....
désolé, j'ai toujours pas posté...
par contre hiers j'ai fait un truc inverse (j'ai demandé les avis des autres contributeurs), et donc peut être que je posterai une astuce aussi pour un truc qui fait totalement l'inverse:
fusion des sessions de deux utilisateurs (deux personnes partagent les mêmes variables de sessions). J'ai testé, ca marche...
et je pense que j'essayerai de faire un truc inspiré des sources que je vais mettre ici: si connexion depuis un 2° poste sur un meme compte utilisateur, alors partage de session ! (j'ai pas encore trop d'idées d'applications concrètes, mais bon... peut être un "super panier" pour les sites de vente en ligne => un caddie quoi ;)
par contre hiers j'ai fait un truc inverse (j'ai demandé les avis des autres contributeurs), et donc peut être que je posterai une astuce aussi pour un truc qui fait totalement l'inverse:
fusion des sessions de deux utilisateurs (deux personnes partagent les mêmes variables de sessions). J'ai testé, ca marche...
et je pense que j'essayerai de faire un truc inspiré des sources que je vais mettre ici: si connexion depuis un 2° poste sur un meme compte utilisateur, alors partage de session ! (j'ai pas encore trop d'idées d'applications concrètes, mais bon... peut être un "super panier" pour les sites de vente en ligne => un caddie quoi ;)