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

PHP & Base de données Discussion :

système authentification en MVC


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut système authentification en MVC
    Bonjour,
    Je fais encore appel à vous pour mon petit projet. Je trouve très compliqué de mettre en place l'authentification connexion etc. peut-être parce que je débute... et ma logique doit être désastreuse
    Je pensais dans mon model Utilisateur :
    créer une fonction est_connecte pour détecter si l'utilisateur est connecté sinon ouvrir une session et mettre dans la session le login :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     function est_connecte ($identifiant) {
            //si la session est active ou non
            if(session_status === PHP_SESSION_NONE) {
                session_start();
                $_SESSION['login'] = $identifiant;
            }
        }
    puis créer une methode de connexion :
    - faire une première requête pour comparer le login puis une deuxieme pour le mot de passe mais je ne sais pas trop comment la mettre en place et ou placer :password, d'ailleur j'ai une erreur password indefini...
    - puis pour finir faire appel à la methode est_connecte pour faire si besoin le session_start() et rediriger vers accueil.php ou autre page.
    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
    function connexion($identifiant, $password) {
            //control login
            if(is_string($identifiant) && is_string($password) && !empty($identifiant) && !empty(password)) {
                $req=$this->bdd->prepare("select id_utilis, login, password from utilisateur 
                    where utilisateur.login = :identifiant");
                    $req->bindParam(':identifiant', $identifiant);
                    $req->bindParam(':password', $password);
                    $req->execute();
                    $count = $req->rowCount();
                    $resultat = $req->fetchAll(PDO::FETCH_ASSOC);
                    var_dump($count);
                if($count===1) {
                    //Vérification du mot de passe avec password_verify
                    if(password_verify($password, resultat["password"])) {
                        est_connecte($identifiant);
                        header('location: ../view/vueRecettes.php');
                    }
                }
            } else {
                echo "erreur";
            } 
        }
    mon controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function connexion($identifiant, $password) {
                return $this->modelUtilisateur->connexion($identifiant, $password);
           }
    et pour finir si besoin ma page avec le formulaire de connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php 
    require '../controller/controllerUtilisateur.php';
    $utilisateurController = new ControllerUtilisateur();
     
     
    if(isset ($_POST['identifiant'])) {
        $utilisateur = $utilisateurController->connexion(
            $identifiant = trim(strip_tags($_POST['identifiant'])),
            $password = trim(strip_tags($_POST['password']))
        );
    }
     
    ?>
    Je veux créer quelques chose de basique déjà pour apprendre et comprendre, Est ce que je suis sur la bonne voie ? comment construire ma requête ?
    merci de vos conseils et aide.

  2. #2
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut
    Bonjour assais comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <form class="form-signin" action="traitement.php" method="post" >
      <input type="email" name="email" id="floatingInput"  placeholder="Entrer votre email" required autofocus>
    
       <input type="password" name="password" id="floatingPassword"  placeholder="Password" required >
      <button class="w-100 btn btn-lg btn-primary" type="submit">S'identifier</button>
    </form>
    Puis traitement.php
    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
    <?php session_start();
    
    $email = htmlspecialchars( $_POST['email']) ;
    $password = htmlspecialchars( $_POST['password']);
                 
        $mysqli = new mysqli('127.0.0.1', 'root', '', 'database');
    
        $sql = "SELECT password , pseudo FROM membre WHERE email = '".$email."'";
    
    
    
      if ($data = mysqli_fetch_array($result))
      {
          $pass = $data['password'];
    
          if (password_verify($password , $pass)) {
          //traitement des authorisation
    
         }
          
    
                mysqli_close($mysqli);
                
                $result->close();
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut
    Bonjour,
    merci pour vos conseils et suggestions, donc faire deux fonctions dans mon modelUtilisateur n'est pas une bonne idée ? concernant la requête en me demande de faire du PDO je suppose que je dois faire une requête préparée ?
    merci désolé pour toutes ces questions.

  4. #4
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut
    Oui faire une requête préparé pdo est judicieux. Il faut récupérer les données transmises via la requête.
    Le formulaire te montre comment utiliser le $_POST['password'].

  5. #5
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut
    merci le souci c'est que je sais pas trop comment construire cette requête. Qu'on pensez-vous de ma requête est mes conditions ?

  6. #6
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut
    Tapes sur Google
    PDO et select champs obtenues la requête PDO.
    Désolé je te donnerais le code plus tard
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    $sql =  'SELECT name, color, calories FROM fruit ORDER BY name';
    foreach  ($conn->query($sql) as $row) {
        print $row['name'] . "\t";
        print  $row['color'] . "\t";
        print $row['calories'] . "\n";
    }
    ?>

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 086
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 086
    Points : 8 174
    Points
    8 174
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     function est_connecte ($identifiant) {
            //si la session est active ou non
            if(session_status === PHP_SESSION_NONE) {
                session_start();
                $_SESSION['login'] = $identifiant;
            }
        }
    session_status() est une fonction, il manque des ().
    Je ne comprends pas la logique du nom (est_connecte()) et de l'objectif de la fonction.
    est_connecte() devrait retourner un booléen (un utilisateur est-il connecté ou pas ?), mais pas démarrer une session.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            if(is_string($identifiant) && is_string($password) && !empty($identifiant) && !empty(password)) {
    Je ne vois pas trop ce que les is_string() viennent faire là.
    Pareil pour les empty() (qui sont de faux amis).
    Le type de tes variables et leur bonne valorisation à contrôler en amont, par ex. lors de la définition de ta fonction/méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function connexion(string $identifiant, string $password)
    { ...
    Ton SQL ne prévoit rien pour le mot de passe, il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = <<<SQL
        SELECT ALL id, login, password
        FROM utilisateur
        WHERE login = :identifiant AND password = :password
        SQL;
     
    $req=$this->bdd->prepare($sql);
    $req->bindParam('identifiant', $identifiant);
    $req->bindParam('password', $password);
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut
    merci pour vos explications,
    je voulais créer une fonction pour démarrer la session mais j'ai tout faux,
    concernant la requête oui il manque le :password (j'y avais pensé). Merci de me le rappeler.

    Pour les is_string() et empty() c'est un des dernier cours de ma formation ou il y a exactement une fonction similaire dans le cours(formation purement pour loisir.. mais passionnante)
    Désolé pour tous ces erreurs dans le code et merci de me consacrer votre temps, je commence juste à comprendre le système de connexion et je trouve très dur de le mettre en pratique, je viens juste de débuter en développement et petit à petit j'essaye de m'améliorer et comprendre.

  9. #9
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut
    Je ne maitrisse pas PDO.
    Mais via mysqli Voilà
    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
    $email = htmlspecialchars( $_POST['email']) ;
    $password = htmlspecialchars( $_POST['password']);
    $mysqli = new mysqli('127.0.0.1', 'root', '', 'dbname');
    
        $sql = "SELECT password FROM membre WHERE email = '".$email."'";
    
        if ($data = mysqli_fetch_array($result))
      {
          $pass = $data['password'];
          if (password_verify($password, $pass)) { 
    // TRAITEMENT DE LA CONNEXION
                                                                      }
       }
    mysqli_close($mysqli);
    $result->close();

  10. #10
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 086
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 086
    Points : 8 174
    Points
    8 174
    Billets dans le blog
    17
    Par défaut
    Pour les is_string() et empty() c'est un des dernier cours de ma formation ou il y a exactement une fonction similaire
    Honteux de proposer des formations avec ce genre de contenu.

    Pour faire simple :

    Tu mets un session_start() sur chaque page => De toute manière il faut récupérer l'éventuelle session déjà ouverte

    Pour connecter un utilisateur, après authentification, il suffit de valoriser une variable de session avec les infos de l'utilisateur récupérées en base (mettons dans $record) et que tu veux avoir audispo de page en page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $_SESSION['user'] = [
        'id' => $record->id,
        'name' => $record->name,
        'connected_at' => time(),
        // ...
    ];
    Pour vérifier si un utilisateur est connecté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php if (isset($_SESSION['user'])): ?>
        Bonjour <?= htmlspecialchars($_SESSION['user']['name']) ?> !<br>
        Connecté depuis <?= time() - $_SESSION['user']['connected_at'] ?> sec.<br>
        <a href="logout.php">Déconnexion</a>
    <?php else: ?>
        <a href="login.php">Connexion</a>
    <?php endif ?>
    Pour la déconnexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unset($_SESSION['user']);
    Voilà les 3 primitives. Elles sont suffisamment simples pour être utilisées en l'état.
    Lorsque tu maitriseras le principe tu pourras les encapsuler dans des fonctions ou un objet.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 086
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 086
    Points : 8 174
    Points
    8 174
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Philcmoi Voir le message
    Je ne maitrisse pas PDO.
    Et ni l'indentation
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  12. #12
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 201
    Points : 92
    Points
    92
    Par défaut
    merci pour vos explications du basique de la session.
    Oui le plus difficile je trouve pour un débutant est de mettre cela dans des fonctions et imbriquer le tout. Je vais regarder tout cela.
    merci encore et bonne journée.

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

Discussions similaires

  1. Système authentification persistant.
    Par defacta dans le forum Langage
    Réponses: 9
    Dernier message: 16/05/2011, 18h00
  2. Réponses: 3
    Dernier message: 26/01/2010, 21h31
  3. Mis en place d'un système Authentification forte
    Par moi95 dans le forum Sécurité
    Réponses: 0
    Dernier message: 18/03/2009, 10h31
  4. [Système] Problème authentification site
    Par bilowlex dans le forum Langage
    Réponses: 3
    Dernier message: 17/02/2007, 08h52
  5. [Système] Aide pour authentification
    Par Pushka07 dans le forum Langage
    Réponses: 40
    Dernier message: 16/08/2006, 11h34

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