IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Connexion unique par utilisateur / deconnexion


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Independant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Independant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Connexion unique par utilisateur / deconnexion
    Bonjour à tous,

    grand utilisateur du forum, j'ai toujours trouvé une solution à mes problèmes mais la je coince,

    je sollicite donc pour la première fois votre aide sur un problème que j'ai en ce moment.

    (à noter que je suis très débutant en PHP/Mysql)

    Voilà, je suis entrain de faire un site assez simple en soit puisque je propose une page d'inscription, un page login et une page profil.

    Ce que je voudrais faire est que lorsqu'un utilisateur se connecte on ne puisse pas se connecter en même temps avec les mêmes identifiants.

    Pour ça dans ma Bdd j'ai rajouté un champs "Connecter", donc quand on se connecte le champs "Connecter" passe de 0 à 1 et on est dirigé vers son profil, jusque la tout va bien.

    Mon problème est lorsqu'on est donc connecté à son profil, quand on se déconnecte ou quitte la page ou navigateur, impossible de modifier le champs Connecter de 1 à 0.

    je vous poste mon code ça sera plus clair.

    Ma page Login

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php
    header('Content-type: text/html; charset=UTF-8');
     ?>
     <?
     // Données générales sur le serveur SQL
    ...
        // Se conneter au serveur et sélectionner la base de donnée a utiliser
      mysql_connect("$host", "$username", "$password")or die("cannot connect");
      mysql_select_db("$db_name")or die("cannot select DB");
    // pensez a ouvrir une connexion vers mysql ici
    // voir les exercices dans le menu de droite pour cela.
     
    if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])) {
      extract($_POST);
      // on recupère le password de la table qui correspond au login du visiteur
      $sql = "select password,actif from table where Username='".$login."'";
     $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
     
      $data = mysql_fetch_assoc($req);
     
      if($data['password'] != $pass) {
        include('include.php'); // On inclut le formulaire d'identification
        exit;
        }
        elseif($data['actif'] != 1) {
        include('includeactif.html'); // On inclut le formulaire d'identification
        exit;
     
      }
      else {
        session_start();
        $_SESSION['login'] = $login;
         $sql2 = "UPDATE table SET Connecter = 1 WHERE Username='".$login."'";
         $req2 = mysql_query($sql2) or die('Erreur SQL !<br>'.$sql2.'<br>'.mysql_error());
         }
     
     
       ?>
       <meta charset="UTF-8">
       <div class="message">vous etes bien connecté<br />
    <meta http-equiv="refresh" content="0;URL=profil.php">
    <?
        // vers la page d'accueil de votre espace membres
      }  
    }
    else {
       include('include.php'); // On inclut le formulaire d'identification
       exit;
    }
     
     
    ?>
    A ce moment si le mot de passe correspond... on est redirigé vers son profil dont voici le code, et c'est la que je bloque

    Ma page Profil:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?
    header('Content-Type: text/html; charset=utf-8');
    session_start();
    /*
    si la variable de session login n'existe pas cela siginifie que le visiteur
    n'a pas de session ouverte, il n'est donc pas logué ni autorisé à
    acceder à l'espace membres
    */
    if(!isset($_SESSION['login'])) {
      echo 'Vous n\'êtes pas autorisé à acceder à cette zone';
      include('login.html');
      exit;
    }
    ?>
     <html>
     
        <body>
     
    </body>
    </html>      
     
    <?
     
    //pour la clôture :
     
    session_unset(); //efface les variable session
    session_destroy();//détruit la session
    $_SESSION = null;//histoire d'être sûre
     
     
    ?>
    Merci beaucoup par avance pour votre aide.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Que l'utilisateur ferme son navigateur ou qu'il se deconnecte par un bouton par exemple, ce n'est pas du tout la même chose.

    Il n'y a pas de vrai bon moyen d'intercepter un utilisateur qui ferme son navigateur.
    Tout ce qu'on peut faire c'est conserver la date de la derniere action de l'utilisateur sur le site ; si la derniere action est ancienne, on considere que l'utilisateur est deconnecté.

    Dans le cas ou l'utilisateur utilise un bouton "deconnecter" tu as alors par contre toute marge de manoeuvre pour inscrire les actions que tu veux faire.
    Par contre je ne vois rien la dessus dans le code que tu nous montres.

    Pense quand même dans tout ca que l'utilisateur dont le navigateur plante par exemple, devra attendre que sa session se termine pour pouvoir revenir sur le site.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Independant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Independant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonsoir Sabotage,
    merci pour ta réponse.

    Est ce que tu pourrais m'aiguiller dans le cas ou je conserve la date de la dernière action et considérer que l'utilisateur est déconnecté?


    Merci de ton aide.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut qu'il y ait un point central sur ton site afin de pouvoir lancer l'action quel que soit la page que visite ton utilisateur.
    A partir de la tu enregistres pour l'utilisateur dans ta base de données, la date actuelle.

    Un utilisateur est donc deconnecté si la colonne "deconnecte" que tu as deja mise en place vaut 0 ou si elle vaut 1 mais que la date de sa dernière activité est plus vieille que xx minutes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    oui, comme sabotage utilisation de timein ( enregistrer le timestamp de connexion en bdd ) , perso je crée une deuxième colonne timeout, j'enregistre à la connexion que timeout = timein + 1800;

    à chaque changement de page, ou requête ajax je considère comme fiable l'action et donc repousse le timeout à timestamp(action) + 1800 si le timeout n'est pas expiré

    si l'utilisateur fait une action après timeout je considère qu'il est resté au moins une heure sans activité

    dans le cas ou j'ai des fichiers partagés qui sont verrouillé tant que le user qui à ouvert le fichier est en dessous de son timeout, cela me permet si un deuxième utilisateur se connecte de vérifier les timeout de tout le monde et de forcer la fermeture des tokens des sessions expirés et donc des verrous posés sur les tokens

    le timein/timeout est en relation avec l'identifiant unique de session php (du navigateur ) et l'indentifant unique de l'utilisateur

    chaque fois que l'utilisateur se connecte sur un navigateur différent( ce qui est vrai aussi si il ferme FF et se sert de FF comme nouveau navigateur ) , je ferme le token éventuellement existant, donc user1 se connexion sur FF il a un token de 1 heure, il change de navigateur et prend IE, je ferme le token ff, qui à pour action sur la prochaine action éventuel sur ff de le mettre sur la page login

    en parallèle je pose éventuellement aussi un script javascript qui envoi un bing en ajax régulièrement, qui permet si l'utilisateur s’endort de fermer son token


    Ainsi j’obtiens :
    une connexion unique par utilisateur quelque soit le navigateur
    la possibilité de verrouiller certaines instances tant que l'utilisateur ayant mis un verrou est considéré comme actif
    me servant beaucoup de javascript cela me permet de fermer la session d'un utilisateur endormi et donc des vérrous posés sans fermer sa page, ou la page sur laquelle il à commencé à travailler avant de s'endormir, et de lui reproposer la page si je détecte que personne n'à proposé de modification entre deux ( bon il existe aussi un moyen de versionner...)
    et surement des choses que j’oublie

    Conception / Dev

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Je penserais aussi à une requête ajax récurrente mais je crois que je l'utiliserais autrement, pour vérifier qu'un utilisateur est toujours connecté par exemple en updatant toute les quinze secondes un champ de la bdd avec la date actuelle. Lors de la connexion d'un même identifiant ont peut dire que c'est libre si la date de ce champ est passée depuis plus de trente seconde par rapport à la date actuelle.

    En complément je ferais aussi comme indique sabotage dans son dernier message pour enregistrer la date de la dernière action (volontaire) du visiteur. Au bout de x temps sans action on peut considérer qu'il s'est endormi et on le déconnecte précédé d'un message d'avertissement, c'est plus sympa (la requête ajax pourrait aussi remplir cet office en scrutant la dernière action volontaire).

    L'avantage de la requête ajax en complément c'est qu'elle libère beaucoup plus vite l'identifiant dès (après 30 secondes dans mon exemple) que le visiteur quitte le site ou a fortiori qu'il ferme son navigateur.

    Cela m'a l'air assez simple mais j'ai peut-être oublié quelque chose car je n'ai jamais eu à traiter réellement ce genre de problème. Après c'est sur qu'un jeton de présence dépendant d'une requête ajax c'est pas le rêve niveau fiabilité... genre avec des navigateurs bugués comme chrome ou safari il est (ou était) impossible de faire une requête ajax durant l'upload d'un fichier par exemple.

  7. #7
    Membre du Club
    Profil pro
    Info
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Info

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Points : 46
    Points
    46
    Par défaut
    Bonjour budfoxob !

    Si je puis me permettre je trouve personnellement cette solution, de ne pouvoir se connecter que si l'on est déconnecté, un peu contraignante.
    En effet, sabotage a déjà évoqué la cas du navigateur qui plante, et le temps d'attente nécessaire pour pouvoir se reconnecter, mais on pourrait aussi imaginer que je me connecte, que j'aille me faire un café ... et quand je reviens si j'ai été un peu long à la première action on me dit "Reconnectez vous" ... ou je me connecte sur mon ordi et je peux plus me connecter ailleurs, style sur mon tel, avant un temps défini et il y a certainement plein d'autres cas de figures.
    Du coup je me demandais quelle était vraiment le but que tu recherchais en imposant cette contrainte ? Que veux tu vraiment éviter ? Ou quelle réflexion a été à l'origine de cette solution ?
    Car il y a en fonction de tes motivations, peut-etre d'autres solutions moins contraignantes.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Independant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Independant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous et surtout merci votre aide.

    Effectivement ce n'est pas super agréable et surtout pas très pratique pour ceux qui veulent
    se connecter via plusieurs terminaux. Du coup j'ai opté pour ne pas appliquer cette restriction.

    J'ai malgré tout essayé vos idées, et cela fonctionnait bien.

    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] Enregistrement unique par utilisateur
    Par vincent.le dans le forum Symfony
    Réponses: 9
    Dernier message: 28/01/2011, 20h10
  2. Table temporaire unique par utilisateurs
    Par Zabriskir dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/01/2008, 18h55
  3. trop de connexion simultanée par utilisateur
    Par GoodTimes dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 09/12/2007, 10h39
  4. Réponses: 12
    Dernier message: 21/12/2006, 11h49
  5. Connexion refusée par MySQL : j'ai effacé tous les utilisateurs
    Par AliochaBada dans le forum Installation
    Réponses: 2
    Dernier message: 16/08/2006, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo