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 :

Connexion et session en MVC


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut Connexion et session en MVC
    Bonjour,

    J'ai actuellement un blocage dans mon projet en cours. J'ai compris ce que je devais faire mais après de multiples essais ça ne fonctionne pas.. du coup j'ai tout effacé (enfin une partie ahaha).

    En gros, le formulaire d'inscription fonctionne bien, la bdd se remplit avec le mdp hashé, tout est ok.
    Maintenant, pour lancer une session avec le formulaire de connexion, ça coince... J'ai mis en commentaire dans le code (dans function connexion()) ce que j'ai compris de ce que je devais faire, mais je coince.. si quelqu'un peut m'éclairer.

    Alors côté modèle, dans mon login manager j'ai ceci :
    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
    class LoginManager
    {
        public function registerUser($username, $password)
    	{
            $pass_hache = password_hash($password, PASSWORD_DEFAULT);
        	$db = $this->dbConnect();
            $login = $db->prepare('INSERT INTO user(username, password, FKtype_user) VALUES(?, ?, 2)');
            $affectedLines = $login->execute(array($username, $pass_hache));
     
            return $affectedLines;
    	}
     
        public function sessionUser($username)
        {
            $db = $this->dbConnect();
            $login = $db->prepare('SELECT id, password FROM user WHERE username= ?');
            $login->execute(array($username));
     
            return $login;  
        }
     
        // Connexion à la BDD
        private function dbConnect()
        {
            $servername = "xxx";
            $username = "xxx";
            $password = "xxx";
            $database = "xxx";
     
            $db = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
            return $db;    
        }
    }
    Coté contrôleur :
    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
     
    function addUser($username, $password)
    {
        $loginManager = new LoginManager();
     
        $affectedLines = $loginManager->registerUser($username, $password);
     
        if ($affectedLines === false) {
            // Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
            echo "<script>alert(\"Inscription impossible ! Le pseudo que vous tentez de prendre est peut-être déjà utilisé....\");
            document.location.href = '/index.php?action=newUser'</script>";
     
        }    
        else {
            echo "<script>alert(\"Vous êtes maintenant inscrit ! Veuillez vous connecter.\");
            document.location.href = '/index.php?action=connexion'</script>";
        }
    }
     
    function connexion($username, $passwordform)
    {
        $loginManager = new LoginManager();
        $login = $loginManager->sessionUser($username);
     
        //Si rien dans $login = infos non récupérées dans BDD donc user n'existe pas 
     
        //Si infos dans $login = user existe -> vérifier mot de passe 
     
       //Si mdp ok, lancer $_SESSION !
     
    }
     
    function deconnexion()
    {
        $_SESSION = array();
        session_destroy();
        header('Location: /index.php?action=connexion');
        exit;
    }
    Côté routeur (je mets tout le bloc) :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <?php
    session_start();
    require('./controleurs/controller.php');
     
    try { // On essaie de faire des choses
        if (isset($_GET['action'])) {
            if ($_GET['action'] == 'listPosts') {
                listPosts();
            }
            elseif ($_GET['action'] == 'post') {
                if (isset($_GET['id']) && $_GET['id'] > 0) {
                    post();
                }
                else {
                    // Erreur ! On arrête tout, on envoie une exception, donc au saute directement au catch
                    throw new Exception('Aucun identifiant de billet envoyé');
                }
            }
            elseif ($_GET['action'] == 'addComment') {
                if (isset($_GET['id']) && $_GET['id'] > 0) {
                    if (!empty($_POST['author']) && !empty($_POST['content'])) {
                        addComment($_GET['id'], $_POST['author'], $_POST['content']);
                    }
                    else {
                        // Autre exception
                        throw new Exception('Tous les champs ne sont pas remplis !');
                    }
                }
                else {
                    // Autre exception
                    throw new Exception('Aucun identifiant de billet envoyé');
                }
            }
            elseif ($_GET['action'] == 'newArticle') {
                viewAddArticle();
            }
            elseif ($_GET['action'] == 'addArticle') {
                    if (!empty($_POST['title']) && !empty($_POST['content'])) {
                        addArticle($_POST['title'], $_POST['content']);
                    }
                    else {
                        // Autre exception
                        throw new Exception('Tous les champs ne sont pas remplis !');
                    }
            }
            elseif ($_GET['action'] == 'newUser') {
                viewAddUser();
            }
            elseif ($_GET['action'] == 'addUser') {
                    if (!empty($_POST['username']) && !empty($_POST['password'])) {
                        addUser($_POST['username'], $_POST['password']);
                    }
                    else {
                        // Autre exception
                        throw new Exception('Tous les champs ne sont pas remplis !');
                    }
            }
            elseif ($_GET['action'] == 'connexion') {
                viewConnexion();
            }
            elseif ($_GET['action'] == 'checkconnexion') {
                if(!empty($_POST['username']) && !empty($_POST['password'])){
                    connexion($_POST['username'], $_POST['password']);
                }   
                else {
                    //erreur
                    throw new Exception('Tous les champs ne sont pas remplis !');
                } 
            }
            elseif ($_GET['action'] == 'deconnexion') {
                deconnexion();
            }
            elseif ($_GET['action'] == 'listPostsAdmin') {
                listPostsAdmin();
            }
     
        }
        else {
            listPosts();
        }
    }
    catch(Exception $e) { // S'il y a eu une erreur, alors...
        echo 'Erreur : ' . $e->getMessage();
    }
    Je n'ai pas mis le code de la vue mais je peux le mettre si besoin.

    Merciii

  2. #2
    Membre très actif
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Par défaut
    Tu es bien parti et tes commentaires indiquent le bon fonctionnement, t'as plu qu'à te lancer et le coder
    Il faut hasher le mot de passe que l'utilisateur a rentré avec la même fonction que tu as utiliser lors de l'inscription, et le comparer avec celui de ta base de données.
    Si celui-ci à correct tu peux lancer un session_start(), entrer des valeurs dans la variable $_SESSION. Par exemple $_SESSION['login'], dont tu testeras l'existence dans toutes tes pages nécessitant une connexion pour y accéder.

  3. #3
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Hello,
    Merci pour ton retour, ça me rassure quant à la direction empruntée.
    Je débute et suis un peu larguée tout de même sur pas mal de trucs....

    Dans mon contrôleur, dans ma fonction "connexion()"du coup j'ai fait ça pour l'instant (je commence pas à lancer la session pour l'instant) :

    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
    function connexion($username, $passwordform)
    {
        $loginManager = new LoginManager();
        $login = $loginManager->sessionUser($username);
        $user = $login->fetch(PDO::FETCH_OBJ);
     
        if (!$user) { //Si rien dans $user = infos non récupérées dans BDD donc user n'existe pas 
            echo "<script>alert(\"Pseudo incorrect\");
            document.location.href = '/index.php?action=connexion'</script>";
        }
        else { //Si infos dans $login = user existe -> vérifier mot de passe 
            $mdp = $user->password;
            $validPassword = password_verify($passwordform, $user);
     
            var_dump ($validPassword);
            //Si $validPassword est TRUE, la connexion est réussie
            if($validPassword){
     
                echo "Ok";
                // commencer session
            }
            else{
     
                echo "<script>alert(\"Mot de passe incorrect\");
                document.location.href = '/index.php?action=connexion'</script>";
            }
        }
     
    }
    Et côté routeur j'ai également modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    elseif ($_GET['action'] == 'checkconnexion') {
                if(!empty($_POST['username']) && !empty($_POST['password'])){
                    $passwordform = password_hash($_POST['password'], PASSWORD_DEFAULT);
                    connexion($_POST['username'], $passwordform);
                }   
                else {
                    //erreur
                    throw new Exception('Tous les champs ne sont pas remplis !');
                } 
            }
    Evidemment ça ne marche pas car j'ai encore fait une bêtise ! Cela m'indique "Tous les champs ne sont pas remplis" (donc mon erreur), alors que ce n'est pas le cas..
    J'ai du mal à appliquer la logique concernant les vérifications là....

  4. #4
    Membre très actif
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Par défaut
    Tu as plusieurs messages "Tous les champs ne sont pas remplis !" dans ton routeur, es tu sur de passer dans la bonne boucle ? Pour cela tu peux afficher un message différent, voire utiliser un echo ou un die dans ta boucle if.

    Tu peux commencer par afficher les valeurs contenues dans $_POST ou $_GET['action'] pour être sur qu'elles contiennent les valeurs attendues, du débogage en somme

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Je ne suis pas sûre d'être d'accord avec le découpage entre ce qui doit être dans le controlleur et ce qui doit être dans le LoginManager. Pour moi, ta méthode sessionUser devrait prendre en paramètre le login et le mot de passe, et retourner soit false si l'authentification échoue (ou peut-être jeter une Exception), soit les informations de l'utilisateur à mettre en session (ou juste true, en fonction de ce qui t'arrange)

    Autre point de structure : à ta place j'utiliserais un switch pour tester les différentes valeurs de $_GET['action']. Comme ça, tu t’emmêlerais pas entre les if/elseif/else de $_GET['action'] et ceux du contenu.

    Et comme te l'a conseillé Rpass, mettre des messages différents selon les actions te permettrait sans doute d'y voir plus clair.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Bonjour à tous les deux !

    J'ai modifié le message d'erreur et c'est bien ce dernier qui apparaissait.
    Par contre je me suis aperçu de ma boulette... j'avais une incohérence dans mon formulaire et ce souci est maintenant résolu.

    Cependant, maintenant on me dit toujours "Mot de passe incorrect", donc il y a un truc que je fais mal dans le hashage ou dans la vérification..
    En effet, si je fais un var_dump de $validPassword, ça me renvoie false..

  7. #7
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Ahhh oui, je m'appuyais sur le message de Rpass que j'avais très mal compris de mon côté :
    Citation Envoyé par -Rpass- Voir le message
    Il faut hasher le mot de passe que l'utilisateur a rentré avec la même fonction que tu as utiliser lors de l'inscription, et le comparer avec celui de ta base de données.
    Je vais modifier ça

  8. #8
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Youpiiii !!
    Nom : Capture d’écran 2019-10-22 à 14.09.23.png
Affichages : 3167
Taille : 8,4 Ko

    Merci à tous les deux, je regarde pour intégrer les sessions maintenant !

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

Discussions similaires

  1. Augmenter le nombre de connexion - PROCESS / SESSIONS
    Par 6bil1 dans le forum Administration
    Réponses: 9
    Dernier message: 12/02/2009, 11h36
  2. Connexion a session (fermeture connexion reseaux)
    Par nanarr dans le forum Développement
    Réponses: 3
    Dernier message: 30/04/2008, 11h33
  3. Problème de script de connexion et session
    Par dembroski dans le forum Langage
    Réponses: 4
    Dernier message: 27/08/2007, 13h34
  4. [Cookies] connexion, les sessions ne se font pas
    Par schats dans le forum Langage
    Réponses: 4
    Dernier message: 06/05/2007, 17h49
  5. Pools, connexions et sessions BDD
    Par Jeweller dans le forum XMLRAD
    Réponses: 17
    Dernier message: 17/03/2006, 12h59

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