{"id":2385,"date":"2023-01-13T20:51:32","date_gmt":"2023-01-13T19:51:32","guid":{"rendered":"https:\/\/www.webodesign.net\/?page_id=2385"},"modified":"2023-01-21T18:50:51","modified_gmt":"2023-01-21T17:50:51","slug":"creation-dun-module-dauthentification","status":"publish","type":"page","link":"https:\/\/www.webodesign.net\/?page_id=2385","title":{"rendered":"Cr\u00e9ation d&rsquo;un module d&rsquo;authentification"},"content":{"rendered":"\n<div class=\"wp-block-uagb-container uagb-block-b04d2e57 alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-uagb-container uagb-block-9bc52e52\">\n<div class=\"wp-block-uagb-advanced-heading uagb-block-d2e0776b\"><p class=\"uagb-heading-text\">Cr\u00e9ation d&rsquo;un module d&rsquo;authentification<\/p><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-layout-constrained\" style=\"border-style:none;border-width:0px;border-radius:0px\">\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-4f0f718c     \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"30\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tSommaire\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap\">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#pr\u00e9sentation\" class=\"uagb-toc-link__trigger\">Pr\u00e9sentation<\/a><li class=\"uagb-toc__list\"><a href=\"#1-cr\u00e9ation-du-sous-domaine-auth-et-installation-du-prototype-de-d\u00e9part\" class=\"uagb-toc-link__trigger\">1. Cr\u00e9ation du sous-domaine &quot;auth&quot; et installation du prototype de d\u00e9part<\/a><li class=\"uagb-toc__list\"><a href=\"#2-la-base-de-donn\u00e9es\" class=\"uagb-toc-link__trigger\">2. La base de donn\u00e9es<\/a><li class=\"uagb-toc__list\"><a href=\"#3-le-prototype-de-d\u00e9part\" class=\"uagb-toc-link__trigger\">3. Le prototype de d\u00e9part<\/a><li class=\"uagb-toc__list\"><a href=\"#4-cr\u00e9ation-du-mod\u00e8le-visiteur\" class=\"uagb-toc-link__trigger\">4. Cr\u00e9ation du mod\u00e8le &quot;Visiteur&quot;<\/a><li class=\"uagb-toc__list\"><a href=\"#5-cr\u00e9ation-de-la-page-de-login\" class=\"uagb-toc-link__trigger\">5. Cr\u00e9ation de la page de login<\/a><li class=\"uagb-toc__list\"><a href=\"#6-validation-de-la-connexion\" class=\"uagb-toc-link__trigger\">6. Validation de la connexion<\/a><li class=\"uagb-toc__list\"><a href=\"#7-page-de-profil\" class=\"uagb-toc-link__trigger\">7. Page de profil<\/a><li class=\"uagb-toc__list\"><a href=\"#8-deconnexion\" class=\"uagb-toc-link__trigger\">8. Deconnexion<\/a><li class=\"uagb-toc__list\"><a href=\"#9-s\u00e9curisation-de-la-partie-utilisateur\" class=\"uagb-toc-link__trigger\">9. S\u00e9curisation de la partie &quot;utilisateur&quot;<\/a><li class=\"uagb-toc__list\"><a href=\"#10-cr\u00e9ation-de-compte\" class=\"uagb-toc-link__trigger\">10. Cr\u00e9ation de compte<\/a><li class=\"uagb-toc__list\"><a href=\"#11-validation-de-cr\u00e9ation-de-compte\" class=\"uagb-toc-link__trigger\">11. Validation de cr\u00e9ation de compte<\/a><li class=\"uagb-toc__list\"><a href=\"#12-envoi-du-mail-de-validation\" class=\"uagb-toc-link__trigger\">12. Envoi du mail de validation<\/a><li class=\"uagb-toc__list\"><a href=\"#13-validation-du-compte-par-mail\" class=\"uagb-toc-link__trigger\">13. Validation du compte par mail<\/a><li class=\"uagb-toc__list\"><a href=\"#14-modification-du-mail\" class=\"uagb-toc-link__trigger\">14. Modification du mail<\/a><li class=\"uagb-toc__list\"><a href=\"#15-validation-de-la-modification-du-mail\" class=\"uagb-toc-link__trigger\">15. Validation de la modification du mail<\/a><li class=\"uagb-toc__list\"><a href=\"#16-modification-du-mot-de-passe\" class=\"uagb-toc-link__trigger\">16. Modification du mot de passe<\/a><li class=\"uagb-toc__list\"><a href=\"#17-ajout-dun-code-de-v\u00e9rification-en-javascript\" class=\"uagb-toc-link__trigger\">17. Ajout d&#039;un code de v\u00e9rification en JavaScript<\/a><li class=\"uagb-toc__list\"><a href=\"#18-validation-du-changement-de-mot-de-passe\" class=\"uagb-toc-link__trigger\">18. Validation du changement de mot de passe<\/a><li class=\"uagb-toc__list\"><a href=\"#19-suppression-de-compte\" class=\"uagb-toc-link__trigger\">19. Suppression de compte<\/a><li class=\"uagb-toc__list\"><a href=\"#20-validation-de-la-suppression-de-compte\" class=\"uagb-toc-link__trigger\">20. Validation de la suppression de compte<\/a><li class=\"uagb-toc__list\"><a href=\"#21-ajout-dune-image-de-profil\" class=\"uagb-toc-link__trigger\">21. Ajout d&#039;une image de profil<\/a><li class=\"uagb-toc__list\"><a href=\"#22-modification-de-limage-de-profil\" class=\"uagb-toc-link__trigger\">22. Modification de l&#039;image de profil<\/a><li class=\"uagb-toc__list\"><a href=\"#23-suppression-de-limage-lors-de-la-suppression-du-compte\" class=\"uagb-toc-link__trigger\">23. Suppression de l&#039;image lors de la suppression du compte<\/a><li class=\"uagb-toc__list\"><a href=\"#24-partie-administrateur-1\" class=\"uagb-toc-link__trigger\">24. Partie administrateur &#8211; 1<\/a><li class=\"uagb-toc__list\"><a href=\"#25-partie-administrateur-2\" class=\"uagb-toc-link__trigger\">25. Partie administrateur &#8211; 2<\/a><li class=\"uagb-toc__list\"><a href=\"#26-s\u00e9curisation-de-la-session-avec-un-cookie\" class=\"uagb-toc-link__trigger\">26. S\u00e9curisation de la session avec un cookie<\/a><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-39\" style=\"padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\">\n<div class=\"wp-block-column is-layout-constrained wp-container-37\">\n<div class=\"wp-block-group is-layout-flow\">\n<div class=\"wp-block-group uag-hide-desktop uag-hide-tab uag-hide-mob is-layout-constrained\">\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-apache\">&lt;pre&gt;&lt;code&gt;&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"1-i-achat-nom-de-domaine\" style=\"color:#fffdf8;margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">Pr\u00e9sentation<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-2f28b9\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">Pr\u00e9sentation<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Pr\u00e9sentation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1000\" height=\"643\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-03.jpg\" alt=\"\" class=\"wp-image-2392\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-03.jpg 1000w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-03-300x193.jpg 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-03-768x494.jpg 768w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p><\/p>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">1. Cr\u00e9ation du sous-domaine \u00ab\u00a0auth\u00a0\u00bb et installation du prototype de d\u00e9part<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-e09fbd\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">1. Cr\u00e9ation du sous-domaine \u00ab\u00a0auth\u00a0\u00bb et installation du prototype de d\u00e9part <\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va partir d&rsquo;un prototype (auth.zip) \u00e9crit en php avec une structure de type MVC.<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-ddbe75ef\"><div class=\"uagb-heading-text\">Copie du fichier archive (auth.zip) sur le VPS<\/div><\/div>\n\n\n\n<p>On ex\u00e9cute le programme \u00ab\u00a0psftp.exe\u00a0\u00bb de puTTY pour copier le fichier archive (auth.zip contenant les sources) sur le VPS. Le fichier se trouve dans le r\u00e9pertoire \u00ab\u00a0D:\\Program Files\\PuTTY\\transfert\u00a0\u00bb<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;Shell&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">Open contabo_remi\n# saisir la passPhrase\n# Remote working directory is \/home\/remi\npsftp&gt;lcd transfert\npsftp&gt;put auth.zip .\/transfert\/auth.zip\npsftp&gt;exit<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-37c9ae67\"><div class=\"uagb-heading-text\">Cr\u00e9ation du dossier racine du site Auth et d\u00e9compression de l&rsquo;archive <\/div><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;Shell&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">remi@vmi820488:~$ cd \/var\/www\/projets\/\nremi@vmi820488:\/var\/www\/projets$ ll\nremi@vmi820488:\/var\/www\/projets$ sudo mkdir webAuth\nremi@vmi820488:\/var\/www\/projets$ cd webAuth\/\nremi@vmi820488:\/var\/www\/projets\/webAuth$ sudo unzip ~\/transfert\/auth.zip -d .\nremi@vmi820488:\/var\/www\/projets\/webAuth$ cd gestionRole\/\nremi@vmi820488:\/var\/www\/projets\/webAuth\/gestionRole$ sudo mv * ..\/\nremi@vmi820488:\/var\/www\/projets\/webAuth\/gestionRole$ sudo mv .htaccess ..\/\nremi@vmi820488:\/var\/www\/projets\/webAuth\/gestionRole$ cd ..\nremi@vmi820488:\/var\/www\/projets\/webAuth$ sudo rm -d .\/gestionRole\/\n\nremi@vmi820488:\/var\/www\/projets\/webAuth$ ll\ntotal 32\ndrwxr-xr-x 6 root     root     4096 Jan 13 17:57 .\/\ndrwxr-xr-x 5 www-data www-data 4096 Jan 13 17:52 ..\/\n-rw-r--r-- 1 root     root      134 Apr 14  2021 .htaccess\ndrwxr-xr-x 2 root     root     4096 May  9  2021 controllers\/\n-rw-r--r-- 1 root     root      877 May  2  2021 index.php\ndrwxr-xr-x 2 root     root     4096 May  9  2021 models\/\ndrwxr-xr-x 5 root     root     4096 May  9  2021 public\/\ndrwxr-xr-x 3 root     root     4096 May  9  2021 views\/<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-f38cbb7d\"><div class=\"uagb-heading-text\">Modification du propri\u00e9taire des fichiers du site \u00ab\u00a0Auth\u00a0\u00bb <\/div><\/div>\n\n\n\n<p>A la fin du listing pr\u00e9c\u00e9dent, on remarque que le super utilisateur \u00ab\u00a0root\u00a0\u00bb et le groupe \u00ab\u00a0root\u00a0\u00bb sont propri\u00e9taires de tous les des dossiers et fichiers.<\/p>\n\n\n\n<p>Cette situation pose un probl\u00e8me car le serveur Apache n&rsquo;a aucun droit sur les fichiers qu&rsquo;il doit administrer. On donne donc les droits \u00e0 l&rsquo;utilisateur et le groupe \u00ab\u00a0www-data\u00a0\u00bb (correspondant \u00e0 Apache) \u00e0 tous les fichiers et dossiers de notre site.<\/p>\n\n\n\n<p>L&rsquo;option \u00ab\u00a0-R\u00a0\u00bb \u00e9tant les modifications \u00e0 tous les fichiers et sous-r\u00e9pertoires \u00e0 partir de la racine du site.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;Shell&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">remi@vmi820488:\/var\/www\/projets\/webAuth$ sudo chown -R www-data:www-data \/var\/www\/projets\/webAuth\nremi@vmi820488:\/var\/www\/projets\/webAuth$ ll\ntotal 32\ndrwxr-xr-x 6 www-data www-data 4096 Jan 13 17:57 .\/\ndrwxr-xr-x 5 www-data www-data 4096 Jan 13 17:52 ..\/\n-rw-r--r-- 1 www-data www-data  134 Apr 14  2021 .htaccess\ndrwxr-xr-x 2 www-data www-data 4096 May  9  2021 controllers\/\n-rw-r--r-- 1 www-data www-data  877 May  2  2021 index.php\ndrwxr-xr-x 2 www-data www-data 4096 May  9  2021 models\/\ndrwxr-xr-x 5 www-data www-data 4096 May  9  2021 public\/\ndrwxr-xr-x 3 www-data www-data 4096 May  9  2021 views\/<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-71574018\"><div class=\"uagb-heading-text\">Faire pointer les sous domaines \u00ab\u00a0auth\u00a0\u00bb et \u00ab\u00a0www.auth\u00a0\u00bb sur l&rsquo;adresse IP du VPS <\/div><\/div>\n\n\n\n<p>Voir le chapitre 3 l&rsquo;article TP: Ajout du site Auth en tant que sous-domaine webOdesign.net et appliquer la proc\u00e9dure pour ajouter le sous-domaine \u00ab\u00a0auth\u00a0\u00bb<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-da3b2e81\"><div class=\"uagb-heading-text\">Cr\u00e9ation du fichier de configuration (auth.conf) et activation du site.<\/div><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;Shell&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">remi@vmi820488:\/var\/www\/projets\/webAuth$ cd \/etc\/apache2\/sites-available\nremi@vmi820488:\/etc\/apache2\/sites-available$ sudo nano auth.conf\nremi@vmi820488:\/etc\/apache2\/sites-available$ cat auth.conf\n&lt;VirtualHost *:80&gt;\n    ServerAdmin admin@webodesign.com\n    ServerName www.auth.webodesign.net\n    ServerAlias auth.webodesign.net\n    DocumentRoot \/var\/www\/projets\/webAuth\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n&lt;\/VirtualHost&gt;\nremi@vmi820488:\/etc\/apache2\/sites-available$ sudo a2ensite auth.conf\nEnabling site auth.\nTo activate the new configuration, you need to run:\n  systemctl reload apache2\nremi@vmi820488:\/etc\/apache2\/sites-available$ sudo systemctl reload apache2<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-86416077\"><div class=\"uagb-heading-text\">G\u00e9n\u00e9ration les cl\u00e9s de certification SSL pour les sous domaines \u00ab\u00a0<code>auth<\/code>\u00a0\u00bb et \u00ab\u00a0<code>www.auth<\/code>\u00ab\u00a0<\/div><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;Shell&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">remi@vmi820488:\/etc\/apache2\/sites-available$ sudo certbot --apache\nSaving debug log to \/var\/log\/letsencrypt\/letsencrypt.log\nPlugins selected: Authenticator apache, Installer apache\n\nWhich names would you like to activate HTTPS for?\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n1: alpha.webodesign.net\n2: www.alpha.webodesign.net\n3: auth.webodesign.net\n4: www.auth.webodesign.net\n5: www.webodesign.net\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nSelect the appropriate numbers separated by commas and\/or spaces, or leave input\nblank to select all options shown (Enter 'c' to cancel): 3\nRequesting a certificate for auth.webodesign.net\nPerforming the following challenges:\nhttp-01 challenge for auth.webodesign.net\nWaiting for verification...\nCleaning up challenges\nCreated an SSL vhost at \/etc\/apache2\/sites-available\/auth-le-ssl.conf\nDeploying Certificate to VirtualHost \/etc\/apache2\/sites-available\/auth-le-ssl.conf\nEnabling available site: \/etc\/apache2\/sites-available\/auth-le-ssl.conf\nRedirecting vhost in \/etc\/apache2\/sites-enabled\/auth.conf to ssl vhost in \/etc\/apache2\/sites-available\/auth-le-ssl.conf\n\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nCongratulations! You have successfully enabled https:\/\/auth.webodesign.net\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nIMPORTANT NOTES:\n - Congratulations! Your certificate and chain have been saved at:\n   \/etc\/letsencrypt\/live\/auth.webodesign.net\/fullchain.pem\n   Your key file has been saved at:\n   \/etc\/letsencrypt\/live\/auth.webodesign.net\/privkey.pem\n   Your certificate will expire on 2023-04-16. To obtain a new or\n   tweaked version of this certificate in the future, simply run\n   certbot again with the &quot;certonly&quot; option. To non-interactively\n   renew *all* of your certificates, run &quot;certbot renew&quot;\n - If you like Certbot, please consider supporting our work by:\n\n   Donating to ISRG \/ Let's Encrypt:   https:\/\/letsencrypt.org\/donate\n   Donating to EFF:                    https:\/\/eff.org\/donate-le\n\nremi@vmi820488:\/etc\/apache2\/sites-available$ sudo certbot --apache\nSaving debug log to \/var\/log\/letsencrypt\/letsencrypt.log\nPlugins selected: Authenticator apache, Installer apache\n\nWhich names would you like to activate HTTPS for?\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n1: alpha.webodesign.net\n2: www.alpha.webodesign.net\n3: auth.webodesign.net\n4: www.auth.webodesign.net\n5: www.webodesign.net\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nSelect the appropriate numbers separated by commas and\/or spaces, or leave input\nblank to select all options shown (Enter 'c' to cancel): 4\nRequesting a certificate for www.auth.webodesign.net\nPerforming the following challenges:\nhttp-01 challenge for www.auth.webodesign.net\nWaiting for verification...\nCleaning up challenges\nDeploying Certificate to VirtualHost \/etc\/apache2\/sites-enabled\/auth-le-ssl.conf\nEnhancement redirect was already set.\n\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nCongratulations! You have successfully enabled https:\/\/www.auth.webodesign.net\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nIMPORTANT NOTES:\n - Congratulations! Your certificate and chain have been saved at:\n   \/etc\/letsencrypt\/live\/www.auth.webodesign.net\/fullchain.pem\n   Your key file has been saved at:\n   \/etc\/letsencrypt\/live\/www.auth.webodesign.net\/privkey.pem\n   Your certificate will expire on 2023-04-16. To obtain a new or\n   tweaked version of this certificate in the future, simply run\n   certbot again with the &quot;certonly&quot; option. To non-interactively\n   renew *all* of your certificates, run &quot;certbot renew&quot;\n - If you like Certbot, please consider supporting our work by:\n\n   Donating to ISRG \/ Let's Encrypt:   https:\/\/letsencrypt.org\/donate\n   Donating to EFF:                    https:\/\/eff.org\/donate-le<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-63813ad0\"><div class=\"uagb-heading-text\">Configuration du fichier \u00ab\u00a0<code>auth-le-ssl.conf<\/code>\u00ab\u00a0<\/div><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;Shell&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">remi@vmi820488:\/etc\/apache2\/sites-available$ ll\ntotal 52\ndrwxr-xr-x 2 root root 4096 Jan 16 11:41 .\/\ndrwxr-xr-x 9 root root 4096 Jan 16 11:41 ..\/\n-rw-r--r-- 1 root root 1694 May 16  2022 000-default-le-ssl.conf\n-rw-r--r-- 1 root root 1468 May 16  2022 000-default.conf\n-rw-r--r-- 1 root root  524 Jan 16 11:41 auth-le-ssl.conf\n-rw-r--r-- 1 root root  475 Jan 16 11:40 auth.conf\nremi@vmi820488:\/etc\/apache2\/sites-available$ cat auth-le-ssl.conf\n&lt;IfModule mod_ssl.c&gt;\n&lt;VirtualHost *:443&gt;\n    ServerAdmin admin@webodesign.com\n    ServerName www.auth.webodesign.net\n    ServerAlias auth.webodesign.net\n    DocumentRoot \/var\/www\/projets\/webAuth\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n\nInclude \/etc\/letsencrypt\/options-ssl-apache.conf\nSSLCertificateFile \/etc\/letsencrypt\/live\/www.auth.webodesign.net\/fullchain.pem\nSSLCertificateKeyFile \/etc\/letsencrypt\/live\/www.auth.webodesign.net\/privkey.pem\n&lt;\/VirtualHost&gt;\n&lt;\/IfModule&gt;\nremi@vmi820488:\/etc\/apache2\/sites-available$ sudo nano auth-le-ssl.conf\nremi@vmi820488:\/etc\/apache2\/sites-available$ cat auth-le-ssl.conf\n&lt;IfModule mod_ssl.c&gt;\n&lt;VirtualHost *:443&gt;\n    ServerAdmin admin@webodesign.com\n    ServerName auth.webodesign.net\n    ServerAlias auth.webodesign.net\n    DocumentRoot \/var\/www\/projets\/webAuth\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n\nInclude \/etc\/letsencrypt\/options-ssl-apache.conf\nSSLCertificateFile \/etc\/letsencrypt\/live\/auth.webodesign.net\/fullchain.pem\nSSLCertificateKeyFile \/etc\/letsencrypt\/live\/auth.webodesign.net\/privkey.pem\n&lt;\/VirtualHost&gt;\n&lt;\/IfModule&gt;\n&lt;IfModule mod_ssl.c&gt;\n&lt;VirtualHost *:443&gt;\n    ServerAdmin admin@webodesign.com\n    ServerName www.auth.webodesign.net\n    ServerAlias www.auth.webodesign.net\n    DocumentRoot \/var\/www\/projets\/webAuth\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n\nInclude \/etc\/letsencrypt\/options-ssl-apache.conf\nSSLCertificateFile \/etc\/letsencrypt\/live\/www.auth.webodesign.net\/fullchain.pem\nSSLCertificateKeyFile \/etc\/letsencrypt\/live\/www.auth.webodesign.net\/privkey.pem\n&lt;\/VirtualHost&gt;\n&lt;\/IfModule&gt;\nremi@vmi820488:\/etc\/apache2\/sites-available$ sudo service apache2 restart<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-c38e73ad\"><div class=\"uagb-heading-text\">Configuration des restrictions d&rsquo;acc\u00e8s<\/div><\/div>\n\n\n\n<p>Pendant la phase de d\u00e9veloppement, la connexion sera uniquement autoris\u00e9e \u00e0 une seule adresse ip publique (la mienne). On ajoutera une demande d&rsquo;authentification basique pour compl\u00e9ter la s\u00e9curisation des \u00e9changes.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-apache\">remi@vmi820488:\/var\/www\/projets\/webAuth$ cat .htaccess\nRewriteEngine On\n\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\n\nRewriteRule ^(.*)$ index.php?page=$1\nremi@vmi820488:\/var\/www\/projets\/webAuth$ sudo nano .htaccess\nremi@vmi820488:\/var\/www\/projets\/webAuth$ cat .htaccess\n# Texte affiche dans la fenetre d&#039;authentification login\/password\nAuthName &quot;Zone admin&quot;\n\n# Definition du type d&#039;authentification propos\u00e9\nAuthType Basic\n\n# Chemin menant au fichier .htpasswd\nAuthUserFile \/var\/www\/projets\/webAuth\/.htpapa\n\n# N&#039;acceptera que des utilisateurs delares et autorises\n# et qui ont leur adresse publique mentionnee ci-sessous\n&lt;RequireAll&gt;\n        Require ip xx.xx.xx.xx\n        Require valid-user\n&lt;\/RequireAll&gt;\n\n# R\u00e9\u00e9criture d&#039;URL :\n# tranforme une adresse du type auth.webodesign.net\/accueil en\n# auth.webodesign.net\/index.php?page=accueil\nRewriteEngine On\n\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\n\nRewriteRule ^(.*)$ index.php?page=$1\nremi@vmi820488:\/var\/www\/projets\/webAuth$ sudo cp .htpapa ..\/webAuth\/\nremi@vmi820488:\/var\/www\/projets\/webAuth$ sudo nano  \/etc\/apache2\/sites-available\/auth-le-ssl.conf\nremi@vmi820488:\/var\/www\/projets\/webAuth$ cat \/etc\/apache2\/sites-available\/auth-le-ssl.conf\n&lt;IfModule mod_ssl.c&gt;\n&lt;VirtualHost *:443&gt;\n    ServerAdmin admin@webodesign.com\n    ServerName auth.webodesign.net\n    ServerAlias auth.webodesign.net\n    DocumentRoot \/var\/www\/projets\/webAuth\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n\nInclude \/etc\/letsencrypt\/options-ssl-apache.conf\nSSLCertificateFile \/etc\/letsencrypt\/live\/auth.webodesign.net\/fullchain.pem\nSSLCertificateKeyFile \/etc\/letsencrypt\/live\/auth.webodesign.net\/privkey.pem\n&lt;Directory \/var\/www\/projets\/webAuth\/&gt;\n        Options Indexes FollowSymLinks\n        AllowOverride All\n#       Require expr %{TIME_HOUR} -gt 24 &amp;&amp; %{TIME_HOUR} -lt 23\n#        Require all granted\n&lt;\/Directory&gt;\n&lt;\/VirtualHost&gt;\n&lt;\/IfModule&gt;\n&lt;IfModule mod_ssl.c&gt;\n&lt;VirtualHost *:443&gt;\n    ServerAdmin admin@webodesign.com\n    ServerName www.auth.webodesign.net\n    ServerAlias www.auth.webodesign.net\n    DocumentRoot \/var\/www\/projets\/webAuth\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n\nInclude \/etc\/letsencrypt\/options-ssl-apache.conf\nSSLCertificateFile \/etc\/letsencrypt\/live\/www.auth.webodesign.net\/fullchain.pem\nSSLCertificateKeyFile \/etc\/letsencrypt\/live\/www.auth.webodesign.net\/privkey.pem\n&lt;Directory \/var\/www\/projets\/webAuth\/&gt;\n        Options Indexes FollowSymLinks\n        AllowOverride All\n#       Require expr %{TIME_HOUR} -gt 24 &amp;&amp; %{TIME_HOUR} -lt 23\n#        Require all granted\n&lt;\/Directory&gt;\n&lt;\/VirtualHost&gt;\n&lt;\/IfModule&gt;\nremi@vmi820488:\/var\/www\/projets\/webAuth$ sudo service apache2 restart<\/code><\/pre>\n\n\n\n<p><\/p>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">2. La base de donn\u00e9es<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-f70793\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">2. La base de donn\u00e9es<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>La base de donn\u00e9e est extr\u00eamement simple puisqu&rsquo;elle ne contiendra qu&rsquo;une seule table.<\/p>\n\n\n\n<p>La liste des champs n\u00e9cessaires est la suivante :<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-7\">\n<div class=\"wp-block-column is-layout-flow\" style=\"flex-basis:66.66%\">\n<ul>\n<li>login : cl\u00e9 primaire (on pourrait ne pas utiliser de login mais simplement un mail)<\/li>\n\n\n\n<li>password : le mot de passe utilisateur<\/li>\n\n\n\n<li>mail : l&rsquo;adresse mail de l&rsquo;utilisateur<\/li>\n\n\n\n<li>est_valide : permet de v\u00e9rifier si le compte a \u00e9t\u00e9 valid\u00e9 ou non par mail<\/li>\n\n\n\n<li>role : r\u00f4le de l&rsquo;utilisateur<\/li>\n\n\n\n<li>clef : permet de cr\u00e9er un lien de validation du compte de l&rsquo;utilisateur<\/li>\n\n\n\n<li>image : contient l&rsquo;image du profil de l&rsquo;utilisateur<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-04.jpg\" alt=\"\" class=\"wp-image-2393\" width=\"160\" height=\"164\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-04.jpg 319w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-04-292x300.jpg 292w\" sizes=\"(max-width: 160px) 100vw, 160px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-95b85f32\"><div class=\"uagb-heading-text\">Cr\u00e9ation de la table \u00ab\u00a0utilisateur\u00a0\u00bb dans PhpMyAdmin<\/div><\/div>\n\n\n\n<p>Ex\u00e9cuter phpmyadmin et cr\u00e9er une nouvelle base de donn\u00e9es \u00ab\u00a0web_authentification\u00a0\u00bb.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"533\" height=\"220\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-06.jpg\" alt=\"\" class=\"wp-image-2407\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-06.jpg 533w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-06-300x124.jpg 300w\" sizes=\"(max-width: 533px) 100vw, 533px\" \/><\/figure>\n\n\n\n<p>Cr\u00e9er une table \u00ab\u00a0utilisateur\u00a0\u00bb comportant sept colonnes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"465\" height=\"133\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-07.jpg\" alt=\"\" class=\"wp-image-2408\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-07.jpg 465w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-07-300x86.jpg 300w\" sizes=\"(max-width: 465px) 100vw, 465px\" \/><\/figure>\n\n\n\n<p>Cr\u00e9er les champs de la table \u00ab\u00a0utilisateur\u00a0\u00bb puis cliquer sur enregistrer.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"800\" height=\"521\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-08.png\" alt=\"\" class=\"wp-image-2409\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-08.png 800w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-08-300x195.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-08-768x500.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>Aller dans l&rsquo;onglet \u00ab\u00a0Ins\u00e9rer\u00a0\u00bb pour ajouter un premier utilisateur.<\/p>\n\n\n\n<p>Pour g\u00e9n\u00e9rer le mot de passe crypt\u00e9, on va utiliser une fonction php nomm\u00e9e password_hash :<\/p>\n\n\n\n<ul>\n<li>Dans la classe VisiteurController, dans la fonction \u00ab\u00a0accueil\u00a0\u00bb ajouter la ligne<br><code>echo password_hash(&quot;test&quot;,PASSWORD_DEFAULT);<\/code><\/li>\n\n\n\n<li>Sauvegarder et actualiser la page dans le navigateur. En haut se trouve inscrit le mot de passe crypt\u00e9. Copier le et le coller dans le champ password de phpmyadmin<\/li>\n<\/ul>\n\n\n\n<p>Ex\u00e9cuter pour ajouter le nouvel utilisateur (\u00ab\u00a0bob\u00a0\u00bb)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"407\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-09.png\" alt=\"\" class=\"wp-image-2410\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-09.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-09-300x136.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-09-768x347.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<p>Si probl\u00e8me il y a, initialiser la valeur \u00ab\u00a0clef\u00a0\u00bb \u00e0 z\u00e9ro.<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-1ffeb4e2\"><div class=\"uagb-heading-text\">Connexion \u00e0 la base de donn\u00e9es<\/div><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;models\/Model.class.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\n\nabstract class Model{\n    private static $pdo;\n\n    private static function setBdd(){\n        self::$pdo = new PDO(&quot;mysql:host=localhost;dbname=zsite;charset=utf8&quot;, &quot;root&quot;, &quot;&quot;);\n        self::$pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n    }\n\n    protected function getBdd(){\n        if(self::$pdo === null){\n            self::setBdd();\n        }\n        return self::$pdo;\n    }\n}<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-80bb40ca\"><div class=\"uagb-heading-text\">Exemple de requ\u00eate sur une table<\/div><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;MainManager.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;Model.class.php&quot;);\n\nclass MainManager extends Model{\n\n    public function getDatas(){\n        $req = $this-&gt;getBdd()-&gt;prepare(&quot;SELECT * FROM matable&quot;);\n        $req-&gt;execute();\n        $datas = $req-&gt;fetchAll(PDO::FETCH_ASSOC);\n        $req-&gt;closeCursor();\n        return $datas;\n    }\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">3. Le prototype de d\u00e9part<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-32cff6\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">3. Le prototype de d\u00e9part<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>La programmation de ce module d&rsquo;authentification est con\u00e7u autour d&rsquo;une architecture MVC, c&rsquo;est \u00e0 dire mod\u00e8le, vue, contr\u00f4leur. Ce mod\u00e8le permet de modulariser les traitements en fonction des t\u00e2ches de programmation \u00e0 accomplir. L&rsquo;\u00e9criture et la lecture du code source en est nettement facilit\u00e9.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Liste des modules :<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-11\">\n<div class=\"wp-block-column is-layout-flow\" style=\"flex-basis:66.66%\">\n<ul>\n<li>index.php : c&rsquo;est le fichier de routage. Toutes les demandes\/entr\u00e9es passe par lui. Il aiguille chaque demande (pass\u00e9es via les url) vers la proc\u00e9dure de traitement adapt\u00e9e.<\/li>\n\n\n\n<li>password : le mot de passe utilisateur<\/li>\n\n\n\n<li>mail : l&rsquo;adresse mail de l&rsquo;utilisateur<\/li>\n\n\n\n<li>est_valide : permet de v\u00e9rifier si le compte a \u00e9t\u00e9 valid\u00e9 ou non par mail<\/li>\n\n\n\n<li>role : r\u00f4le de l&rsquo;utilisateur<\/li>\n\n\n\n<li>clef : permet de cr\u00e9er un lien de validation du compte de l&rsquo;utilisateur<\/li>\n\n\n\n<li>image : contient l&rsquo;image du profil de l&rsquo;utilisateur<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"115\" height=\"198\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-05.png\" alt=\"\" class=\"wp-image-2398\"\/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\n\/\/ d\u00e9marrage d'une session : enregistre le contexte (l'\u00e9tat) du profil de chaque \n\/\/ utilisateur \u00e0 un moment donn\u00e9\nsession_start();\n\n\/\/ Constante URL dont le r\u00f4le est de faire en sorte que toutes les demandes renvoy\u00e9es\n\/\/ par les utilisateurs iront pointer vers \u00e0 la racine du site : ce fichier &quot;index.php&quot;\ndefine(&quot;URL&quot;, str_replace(&quot;index.php&quot;,&quot;&quot;,(isset($_SERVER['HTTPS'])? &quot;https&quot; : &quot;http&quot;).\n&quot;:\/\/&quot;.$_SERVER['HTTP_HOST'].$_SERVER[&quot;PHP_SELF&quot;]));\n\n\/\/ Inclusion du fichier principal des contr\u00f4leurs qui auront la facult\u00e9 de piloter\n\/\/ toutes les pages de contenu  du site\nrequire_once(&quot;.\/controllers\/MainController.controller.php&quot;);\n$mainController = new MainController();\n\n\/\/ Chaque demande d'url devra \u00eatre capt\u00e9e dans cette structure switch\/case afin d'\u00eatre\n\/\/ aiguill\u00e9 vers la fonction correspondante.\ntry {\n    if(empty($_GET['page'])){\n        $page = &quot;accueil&quot;;\n    } else {\n        \/\/ exemple : pour une demande type &quot;xx.net\/compte\/profil&quot;, la fonction &quot;explode&quot;\n        \/\/ renverra un tableau contenant : $url[0]='compte' et $url[1]='profil'\n        $url = explode(&quot;\/&quot;, filter_var($_GET['page'],FILTER_SANITIZE_URL));\n        $page = $url[0];\n    }\n\n    switch($page){\n        case &quot;accueil&quot; : $mainController-&gt;accueil();\n        break;\n        case &quot;compte&quot; : \n            switch($url[1]){\n                case &quot;profil&quot;: $mainController-&gt;accueil();\n                break;\n            }\n        break;\n        default : throw new Exception(&quot;La page n'existe pas&quot;);\n    }\n} catch (Exception $e){\n    $mainController-&gt;pageErreur($e-&gt;getMessage());\n}<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;MainController.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\n\/\/ d\u00e9marrage d'une session : enregistre le contexte (l'\u00e9tat) du profil de chaque \n\/\/ utilisateur \u00e0 un moment donn\u00e9\nsession_start();\n\n\/\/ Constante URL dont le r\u00f4le est de faire en sorte que toutes les demandes renvoy\u00e9es\n\/\/ par les utilisateurs iront pointer vers \u00e0 la racine du site : ce fichier &quot;index.php&quot;\ndefine(&quot;URL&quot;, str_replace(&quot;index.php&quot;,&quot;&quot;,(isset($_SERVER['HTTPS'])? &quot;https&quot; : &quot;http&quot;).\n&quot;:\/\/&quot;.$_SERVER['HTTP_HOST'].$_SERVER[&quot;PHP_SELF&quot;]));\n\n\/\/ Inclusion du fichier principal des contr\u00f4leurs qui auront la facult\u00e9 de piloter\n\/\/ toutes les pages de contenu  du site\nrequire_once(&quot;.\/controllers\/MainController.controller.php&quot;);\n$mainController = new MainController();\n\n\/\/ Chaque demande d'url devra \u00eatre capt\u00e9e dans cette structure switch\/case afin d'\u00eatre\n\/\/ aiguill\u00e9 vers la fonction correspondante.\ntry {\n    if(empty($_GET['page'])){\n        $page = &quot;accueil&quot;;\n    } else {\n        \/\/ exemple : pour une demande type &quot;xx.net\/compte\/profil&quot;, la fonction &quot;explode&quot;\n        \/\/ renverra un tableau contenant : $url[0]='compte' et $url[1]='profil'\n        $url = explode(&quot;\/&quot;, filter_var($_GET['page'],FILTER_SANITIZE_URL));\n        $page = $url[0];\n    }\n\n    switch($page){\n        case &quot;accueil&quot; : $mainController-&gt;accueil();\n        break;\n        case &quot;compte&quot; : \n            switch($url[1]){\n                case &quot;profil&quot;: $mainController-&gt;accueil();\n                break;\n            }\n        break;\n        default : throw new Exception(&quot;La page n'existe pas&quot;);\n    }\n} catch (Exception $e){\n    $mainController-&gt;pageErreur($e-&gt;getMessage());\n}<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-eb6159b7\"><div class=\"uagb-heading-text\">Adaptation de la structure au cas de gestion d&rsquo;authentification<\/div><\/div>\n\n\n\n<p>Nous allons ajouter des r\u00e9pertoires pou chaque type d&rsquo;utilisateur venant visiter le site :<\/p>\n\n\n\n<ul>\n<li>Dans le dossier \u00ab\u00a0Contrlollers\u00a0\u00bb, on cr\u00e9\u00e9 les sous-dossiers \u00ab\u00a0Visiteur\u00a0\u00bb, \u00ab\u00a0Administrateur\u00a0\u00bb et \u00ab\u00a0Utilisateur\u00a0\u00bb<\/li>\n\n\n\n<li>Dans le dossier \u00ab\u00a0models\u00a0\u00bb, on cr\u00e9\u00e9 les sous-dossiers \u00ab\u00a0Visiteur\u00a0\u00bb, \u00ab\u00a0Administrateur\u00a0\u00bb et \u00ab\u00a0Utilisateur\u00a0\u00bb<\/li>\n\n\n\n<li>Dans le dossier \u00ab\u00a0views\u00a0\u00bb, on cr\u00e9\u00e9 les sous-dossiers \u00ab\u00a0Visiteur\u00a0\u00bb, \u00ab\u00a0Administrateur\u00a0\u00bb et \u00ab\u00a0Utilisateur\u00a0\u00bb<\/li>\n<\/ul>\n\n\n\n<p>Nous allons cr\u00e9er une page d&rsquo;accueil accessible par les visiteurs (donc \u00e9galement utilisateurs et administrateurs). Il faut donc cr\u00e9er un contr\u00f4leur sp\u00e9cifique pour les visiteurs :<\/p>\n\n\n\n<ul>\n<li>Dans \u00ab\u00a0Controllers\/Visiteur\/\u00a0\u00bb on cr\u00e9\u00e9 un fichier contr\u00f4leur sp\u00e9cifique pour les visiteurs : \u00ab\u00a0Visiteur.controller.php\u00a0\u00bb.<br>On cr\u00e9\u00e9 la class VisiteurController qui va h\u00e9rit\u00e9 de la class MainController de fa\u00e7on \u00e0 sp\u00e9cifier la vue d&rsquo;affichage.<\/li>\n\n\n\n<li>On passe la classe MainController en classe abstraite. Elle ne pourra plus \u00eatre instanci\u00e9e pour obtenir un objet. On modifiera le fichier index.php pour instancier un objet visiteurController \u00e0 la place de mainController.<\/li>\n\n\n\n<li>On d\u00e9placera la fonction \u00ab\u00a0accueil\u00a0\u00bb de MainController vers VisiteurController car on veut la personnalis\u00e9e sp\u00e9cifiquement pour les visiteurs.<\/li>\n\n\n\n<li>La fonction accueil pr\u00e9sente dans le MainController sera d\u00e9plac\u00e9e dans VisiteurController. La vue (view) dans le tableau \u00ab\u00a0$data_page\u00a0\u00bb ira point\u00e9e vers une page d&rsquo;accueil pr\u00e9sente dans le dossier \/views\/Visiteur\/accueil.php (d\u00e9placer le fichier accueil.php pr\u00e9sent dans views).<\/li>\n<\/ul>\n\n\n\n<p>Les modifications impacteront les fichiers MainController.controller.php, Visiteur.controller.php, index.php. Le fichiers \/views\/accueil.view.php sera d\u00e9plac\u00e9 dans le dossier \/views\/Visiteur\/accueil.view.php.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;MainController.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;controllers\/Toolbox.class.php&quot;);\n\nabstract class MainController{\n\n    protected function genererPage($data){\n        extract($data);\n        ob_start();\n        require_once($view);\n        $page_content = ob_get_clean();\n        require_once($template);\n    }\n\n    protected function pageErreur($msg){\n        $data_page = [\n            &quot;page_description&quot; =&gt; &quot;Page permettant de g\u00e9rer les erreurs&quot;,\n            &quot;page_title&quot; =&gt; &quot;Page d'erreur&quot;,\n            &quot;msg&quot; =&gt; $msg,\n            &quot;view&quot; =&gt; &quot;.\/views\/erreur.view.php&quot;,\n            &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n        ];\n        $this-&gt;genererPage($data_page);\n    }\n}<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;Visiteur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;.\/controllers\/MainController.controller.php&quot;);\n\nclass VisiteurController extends MainController {\n\n    public function accueil(){\n       $data_page = [\n            &quot;page_description&quot; =&gt; &quot;Description de la page d'accueil&quot;,\n            &quot;page_title&quot; =&gt; &quot;Titre de la page d'accueil&quot;,\n            &quot;view&quot; =&gt; &quot;views\/Visiteur\/accueil.view.php&quot;,\n            &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n        ];\n        $this-&gt;genererPage($data_page);\n    }\n\n    public function pageErreur($msg){\n        parent::pageErreur($msg);\n    }\n }\n ?&gt;<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;index.php (modifs : lignes 7, 8, 19, 23)&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nsession_start();\n\ndefine(&quot;URL&quot;, str_replace(&quot;index.php&quot;,&quot;&quot;,(isset($_SERVER['HTTPS'])? &quot;https&quot; : &quot;http&quot;).\n&quot;:\/\/&quot;.$_SERVER['HTTP_HOST'].$_SERVER[&quot;PHP_SELF&quot;]));\n\nrequire_once(&quot;.\/controllers\/Visiteur\/Visiteur.controller.php&quot;);\n$visiteurController = new VisiteurController();\n\ntry {\n    if(empty($_GET['page'])){\n        $page = &quot;accueil&quot;;\n    } else {\n        $url = explode(&quot;\/&quot;, filter_var($_GET['page'],FILTER_SANITIZE_URL));\n        $page = $url[0];\n    }\n\n    switch($page){\n        case &quot;accueil&quot; : $visiteurController-&gt;accueil();\n        break;\n        case &quot;compte&quot; : \n            switch($url[1]){\n                case &quot;profil&quot;: $visiteurController-&gt;accueil();\n                break;\n            }\n        break;\n        default : throw new Exception(&quot;La page n'existe pas&quot;);\n    }\n    } catch (Exception $e){\n        $visiteurController-&gt;pageErreur($e-&gt;getMessage());\n    }<\/pre><\/div>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">4. Cr\u00e9ation du mod\u00e8le \u00ab\u00a0Visiteur\u00a0\u00bb<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-80398a\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">4. Cr\u00e9ation du mod\u00e8le \u00ab\u00a0Visiteur\u00a0\u00bb<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Le but est de tester l&rsquo;acc\u00e8s et la consultation de la base de donn\u00e9es menant \u00e0 l&rsquo;affichage des informations sur la page \u00ab\u00a0visiteur\u00a0\u00bb.<\/p>\n\n\n\n<p>Le contenu du code cr\u00e9\u00e9 dans cette \u00e9tape ne sera pas conserv\u00e9e en l&rsquo;\u00e9tat car les visiteurs n&rsquo;ont pas \u00e0 s&rsquo;authentifier.<\/p>\n\n\n\n<p>Les actions \u00e0 mener :<\/p>\n\n\n\n<ul>\n<li>Comme pour les contr\u00f4leurs, un mod\u00e8le principal est conserv\u00e9 et sera \u00e9tendu \u00e0 chaque nouveau mod\u00e8le.<\/li>\n\n\n\n<li>Cr\u00e9ation du mod\u00e8le \u00ab\u00a0Visiteur\u00a0\u00bb et r\u00e9cup\u00e9ration des utilisateurs<\/li>\n\n\n\n<li>Affichage du tableau r\u00e9cup\u00e9r\u00e9 sur la page d&rsquo;accueil \u00e0 l&rsquo;aide de la fonction \u00ab\u00a0print_r\u00a0\u00bb.<\/li>\n\n\n\n<li>Affichage du tableau r\u00e9cup\u00e9r\u00e9 sur la page d&rsquo;accueil dans le partie corps de la vue. Pour cela, ajouter une nouvelle variable \u00ab\u00a0utilisateurs\u00a0\u00bb dans le tableau $data-page afin d&rsquo;afficher l&rsquo;info correctement format\u00e9e en dessous du titre. Le tableau est transmis \u00e0 la fonction \u00ab\u00a0genererPage($data-page)\u00a0\u00bb qui est pr\u00e9sente dans \u00ab\u00a0MainController\u00a0\u00bb et qui va cr\u00e9er des variables \u00e0 partir de chacune des cl\u00e9s du tableau. Donc dans la vue affich\u00e9e (\u00ab\u00a0accueil.view.php\u00a0\u00bb) aura une variable $utilisateur utilisable pour afficher les r\u00e9sultats.<\/li>\n<\/ul>\n\n\n\n<p>Dans un premier temps on transforme la classe MainManager en classe abstraite car on veut pouvoir l&rsquo;\u00e9tendre sur d&rsquo;autres classes qui en h\u00e9riterait (visiteur par exemple). Il est donc logique de d\u00e9placer la fonction \u00ab\u00a0getUtilisateurs\u00a0\u00bb au niveau de la classe VisiteurManager qui ex\u00e9cutera une requ\u00eate sp\u00e9cifique sur une table (ici la table \u00ab\u00a0utilisateur\u00a0\u00bb)<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;Model.class.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\n\nabstract class Model{\n    private static $pdo;\n\n    private static function setBdd(){\n        self::$pdo = new PDO(&quot;mysql:host=localhost;dbname=nom_table;charset=utf8&quot;, &quot;nom_user&quot;, &quot;mot_de_passe&quot;);\n        self::$pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n    }\n\n    protected function getBdd(){\n        if(self::$pdo === null){\n            self::setBdd();\n        }\n        return self::$pdo;\n    }\n}<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;MainManager.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;Model.class.php&quot;);\n\nabstract class MainManager extends Model{\n\n}<\/pre><\/div>\n\n\n\n<p>On cr\u00e9\u00e9 un mod\u00e8le visiteur : \u00ab\u00a0Visiteur.model.php\u00a0\u00bb<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;Visiteur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;.\/models\/MainManager.model.php&quot;);\n\nclass VisiteurManager extends MainManager{\n\n    public function getUtilisateurs(){\n        $req = $this-&gt;getBdd()-&gt;prepare(&quot;SELECT * FROM utilisateur&quot;);\n        $req-&gt;execute();\n        $datas = $req-&gt;fetchAll(PDO::FETCH_ASSOC);\n        $req-&gt;closeCursor();\n        return $datas;\n    }\n}\n?&gt;<\/pre><\/div>\n\n\n\n<p>Les donn\u00e9es ($datas) seront r\u00e9cup\u00e9r\u00e9es au niveau du contr\u00f4leur (classe VisiteurController) :<\/p>\n\n\n\n<p>Un objet Model (VisiteurManager) doit \u00eatre instanci\u00e9 dans le constructeur du cont\u00f4leur (VisiteurController)<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;Visiteur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;.\/controllers\/MainController.controller.php&quot;);\nrequire_once(&quot;.\/models\/Visiteur\/Visiteur.model.php&quot;);\n\nclass VisiteurController extends MainController {\n\n    private $visiteurManager;\n\n    public function __construct(){\n        $this-&gt;visiteurManager = new VisiteurManager();\n    }\n\n    public function accueil(){\n       \/\/ Etape 4 : test de connexion \u00e0 la BD : affichage des utilisateurs\n       $mesUtilisateurs = $this-&gt;visiteurManager-&gt;getUtilisateurs();\n       print_r($mesUtilisateurs);\n\n       $data_page = [\n            &quot;page_description&quot; =&gt; &quot;Description de la page d'accueil&quot;,\n            &quot;page_title&quot; =&gt; &quot;Titre de la page d'accueil&quot;,\n            &quot;utilisateurs&quot; =&gt; $mesUtilisateurs,\n            &quot;view&quot; =&gt; &quot;views\/Visiteur\/accueil.view.php&quot;,\n            &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n        ];\n        $this-&gt;genererPage($data_page);\n    }\n\n    public function pageErreur($msg){\n        parent::pageErreur($msg);\n    }\n }\n ?&gt;<\/pre><\/div>\n\n\n\n<p>Ligne 10 : On instancie un objet \u00ab\u00a0Model\u00a0\u00bb (visiteurManager).<\/p>\n\n\n\n<p>Ligne 15 : On cr\u00e9\u00e9 une variable $mesUtilisateurs qui sera un tableau contenant les informations de chaque utilisateur.<\/p>\n\n\n\n<p>Ligne 21 : On d\u00e9fini un champ \u00ab\u00a0utilisateurs\u00a0\u00bb auquel on rattache les valeurs r\u00e9sultats. A partir de cela, la fonction \u00ab\u00a0genererPage\u00a0\u00bb va cr\u00e9er une variable $utilisateur qui prendra la valeur de $mesUtilisateurs. L&rsquo;affichage des valeurs se fera dans la vue \u00ab\u00a0accueil.view.php\u00a0\u00bb comme montr\u00e9 ci-dessous.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;\/views\/Visiteur\/accueil.view.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;h1&gt;Page d accueil&lt;\/h1&gt;\n&lt;?php foreach($utilisateurs as $utilisateur) {\n    echo $utilisateur['login']. &quot; - &quot; .$utilisateur['mail'];\n}\n?&gt;<\/pre><\/div>\n\n\n\n<p>R\u00e9sultat :<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;javascript&quot;,&quot;mime&quot;:&quot;application\/json&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;language&quot;:&quot;JSON&quot;,&quot;modeName&quot;:&quot;json&quot;}\">Array ( [0] =&gt; Array ( [login] =&gt; bob \n                        [password] =&gt; $2y$1xxx...xxcEvYZFJwOa \n                        [mail] =&gt; bob@gmail.com \n                        [role] =&gt; administrateur \n\t\t\t\t\t\t[image] =&gt; \n\t\t\t\t\t\t[est_valide] =&gt; 1 \n\t\t\t\t\t\t[clef] =&gt; 0 ) )<\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"249\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-10-1024x249.jpg\" alt=\"\" class=\"wp-image-2437\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-10-1024x249.jpg 1024w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-10-300x73.jpg 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-10-768x186.jpg 768w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-10.jpg 1063w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">5. Cr\u00e9ation de la page de login<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-12648d\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">5. Cr\u00e9ation de la page de login<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Le but est cr\u00e9er la page de connexion ou page de login. Cette vue contiendra formulaire contenant les deux champs de saisi login et password ainsi qu&rsquo;un bouton de validation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"255\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-11.png\" alt=\"\" class=\"wp-image-2440\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-11.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-11-300x85.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-11-768x218.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<ul>\n<li>On pourra appeler cette page en ajoutant un item \u00ab\u00a0Se connecter\u00a0\u00bb dans le menu. Lorsque \u00ab\u00a0Se connecter\u00a0\u00bb sera d\u00e9clench\u00e9, on appellera la vue \u00e0 l&rsquo;adresse \u00ab\u00a0www.auth.webodesign.net\/index.php?login\u00a0\u00bb<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;menu.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;li class=&quot;nav-item&quot;&gt;\n\t&lt;a class=&quot;nav-link&quot; aria-current=&quot;page&quot; href=&quot;&lt;?= URL; ?&gt;login&quot;&gt;Se connecter&lt;\/a&gt;\n&lt;\/li&gt;<\/pre><\/div>\n\n\n\n<ul>\n<li>Le lien sera d\u00e9tect\u00e9 par le routeur \u00ab\u00a0index.php\u00a0\u00bb gr\u00e2ce au mot cl\u00e9 \u00ab\u00a0login\u00a0\u00bb. La demande sera alors transmise au contr\u00f4leur \u00ab\u00a0Visiteur.controller.php\u00a0\u00bb par l&rsquo;appel de la fonction \u00ab\u00a0login\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">    switch($page){\n        case &quot;accueil&quot; : $visiteurController-&gt;accueil();\n        break;\n        case &quot;login&quot; : $visiteurController-&gt;login();\n        break;\n...<\/pre><\/div>\n\n\n\n<ul>\n<li>Dans la fonction \u00ab\u00a0login\u00a0\u00bb on utilisera la structure de donn\u00e9es $data_page pour cr\u00e9er une vue personnalis\u00e9e pour la saisi de connexion.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Visiteur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function login(){\n    $data_page = [\n        &quot;page_description&quot; =&gt; &quot;Page de connexion&quot;,\n        &quot;page_title&quot; =&gt; &quot;Page de connexion&quot;,\n        &quot;view&quot; =&gt; &quot;views\/Visiteur\/login.view.php&quot;,\n        &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n    ];\n    $this-&gt;genererPage($data_page);\n}<\/pre><\/div>\n\n\n\n<ul>\n<li>La vue sera cod\u00e9 en HTML dans la vue \u00ab\u00a0login.view.php\u00a0\u00bb en utilisant un formulaire. Dans le lien de retour (m\u00e9thode POST), on utilisera le mot cl\u00e9 \u00ab\u00a0validation_login\u00a0\u00bb comme rep\u00e8re. Les valeurs des login et mot de passe seront contenus dans les variables \u00ab\u00a0login\u00a0\u00bb et \u00ab\u00a0password\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;views\/Visiteur\/login.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;h1&gt;Page de connexion&lt;\/h1&gt;\n&lt;form method=&quot;POST&quot; action=&quot;validation_login&quot;&gt;\n  &lt;div class=&quot;mb-3&quot;&gt;\n    &lt;label for=&quot;login&quot; class=&quot;form-label&quot;&gt;Login&lt;\/label&gt;\n    &lt;input type=&quot;text&quot; class=&quot;form-control&quot; id='login' name=&quot;login&quot; required&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;mb-3&quot;&gt;\n    &lt;label for=&quot;password&quot; class=&quot;form-label&quot;&gt;Password&lt;\/label&gt;\n    &lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;password&quot; name=&quot;password&quot; required&gt;\n&lt;\/div&gt;\n  &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;Connexion&lt;\/button&gt;\n&lt;\/form&gt;<\/pre><\/div>\n\n\n\n<ul>\n<li>Le lien envoy\u00e9 au serveur lors d&rsquo;une validation du formulaire sera d\u00e9tect\u00e9 par le routeur \u00ab\u00a0index.php\u00a0\u00bb gr\u00e2ce au mot cl\u00e9 \u00ab\u00a0validation_login\u00a0\u00bb. Pour l&rsquo;instant, on affichera sommairement les nom \u00ab\u00a0utilisateur\u00a0\u00bb et \u00ab\u00a0password\u00a0\u00bb pour v\u00e9rifier la bonne r\u00e9ception des information d&rsquo;authentification (ligne 8 ci-dessous).<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Visiteur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">switch($page){\n    case &quot;accueil&quot; : $visiteurController-&gt;accueil();\n    break;\n    \/\/ Affichage de la page de login\n    case &quot;login&quot; : $visiteurController-&gt;login();\n    break;\n    \/\/ Traitement au retour du formulaire de login\n    case &quot;validation_login&quot; :  echo $_POST['login'] .' - '. $_POST['password'];\n    break;<\/pre><\/div>\n\n\n\n<p>R\u00e9sultat :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"870\" height=\"342\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-12.png\" alt=\"\" class=\"wp-image-2449\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-12.png 870w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-12-300x118.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-12-768x302.png 768w\" sizes=\"(max-width: 870px) 100vw, 870px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">6. Validation de la connexion<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-39f8cf\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">6. Validation de la connexion<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Le but est de traiter les informations retourn\u00e9es par le formulaire de login. Il faudra v\u00e9rifier que l&rsquo;utilisateur et le mot de passe correspondent bien avec un des utilisateurs stock\u00e9s dans la base de donn\u00e9es.<\/p>\n\n\n\n<p>On utilisera \u00e9galement des fonctions php n\u00e9cessairent \u00e0 la s\u00e9curit\u00e9 (blocage des injection de code SQL par exemple). On en profitera pour cr\u00e9er un fichier d\u00e9di\u00e9 \u00e0 la s\u00e9curit\u00e9.<\/p>\n\n\n\n<ul>\n<li>Dans le fichier de routage \u00ab\u00a0index.php\u00a0\u00bb, les informations seront test\u00e9es (nom utilisateur et mot de passe renseign\u00e9s), filtr\u00e9es (utilisation d&rsquo;une fonction \u00e0 d\u00e9finir dans la classe s\u00e9curit\u00e9), puis aiguill\u00e9s vers la classe contr\u00f4leur des utilisateurs. Si les informations ne sont pas valide, on affichera une ligne mentionnant l&rsquo;erreur de saisie commise dans le formulaire.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">switch($page){\n    ...\n\t\/\/ Inclusion de fichier principal des contr\u00f4leurs qui auront la facult\u00e9 de piloter\n\t\/\/ toutes les pages de contenu  du site\n\trequire_once(&quot;.\/controllers\/Toolbox.class.php&quot;);\n\trequire_once(&quot;.\/controllers\/Securite.class.php&quot;);\n\trequire_once(&quot;.\/controllers\/Visiteur\/Visiteur.controller.php&quot;);\n\trequire_once(&quot;.\/controllers\/Utilisateur\/Utilisateur.controller.php&quot;);\n\t$visiteurController = new VisiteurController();\n\t$utilisateurController = new UtilisateurController();  \n    ...  \n    case &quot;validation_login&quot; :\n    \t\/\/ Si les informations login et password sont renseign\u00e9s, \n        if(!empty ($_POST['login']) &amp;&amp; !empty($_POST['password'])){\n          \t\/\/ on utilise la fonction secureHTML de la classe &quot;Securite&quot; pour \n          \t\/\/ empeicher certaines attaques,\n            $login = Securite::secureHTML($_POST['login']);\n            $password = Securite::secureHTML($_POST['password']);\n          \t\/\/ puis on aiguille les informations vers le contr\u00f4leur \n          \t\/\/ (contr\u00f4le de correspndance dans la BD)\n            $utilisateurController-&gt;validationLogin($login, $password);\n        } else {\n        \/\/ Si les informations login et\/ou password ne sont pas renseign\u00e9s,\n        \/\/ on affiche un message d'erreur grace \u00e0 la fonction &quot;ajouterMessageAlerte&quot;\n        \/\/ pr\u00e9sente dans la classe &quot;Toolbox&quot;\n            Toolbox::ajouterMessageAlerte(&quot;Login ou mot de passe non renseign\u00e9s&quot;, \n                Toolbox::COULEUR_ROUGE);\n          \t\/\/ on redirige la r\u00e9ponse vers l'url de la page de login\n            header('Location: '.URL.&quot;login&quot;);\n        };\n    break;<\/pre><\/div>\n\n\n\n<ul>\n<li>On cr\u00e9\u00e9 un fichier \u00ab\u00a0Securite.class.php\u00a0\u00bb \u00e0 la racine du dossier \u00ab\u00a0controllers\u00a0\u00bb. On d\u00e9finit une classe \u00ab\u00a0Securite\u00a0\u00bb, dans laquelle on cr\u00e9\u00e9 la fonction \u00ab\u00a0secureHTML\u00a0\u00bb qui fait appel \u00e0 la fonction php \u00ab\u00a0htmlentities\u00a0\u00bb pour tester les informations envoy\u00e9es dans le formulaire (protection contre les injections SQL).<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Securite.class.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nclass Securite{\n    public static function secureHTML($chaine){\n      \t\/\/ Permet de supprimer ou convertir en ascii les caract\u00e8res sp\u00e9ciaux\n        return htmlentities($chaine);\n    }\n}\n?&gt;<\/pre><\/div>\n\n\n\n<ul>\n<li>On cr\u00e9\u00e9 un fichier \u00ab\u00a0Utilisateur.model.php\u00a0\u00bb \u00e0 la racine du dossier \u00ab\u00a0models\/Utilisateur\u00a0\u00bb. On d\u00e9finit la classe \u00ab\u00a0UtilisateurManager\u00a0\u00bb (qui h\u00e9rite de la classe \u00ab\u00a0MainManager\u00a0\u00bb), dans laquelle on cr\u00e9\u00e9 les fonctions \u00ab\u00a0isCombinaisonValide\u00a0\u00bb et \u00ab\u00a0isCompteActive\u00a0\u00bb.\n<ul>\n<li>La fonction \u00ab\u00a0isCombinaisonValide\u00a0\u00bb retourne \u00ab\u00a0vrai\u00a0\u00bb si l&rsquo;utilisateur \u00e0 saisi pr\u00e9c\u00e9demment dans le formulaire d&rsquo;authentification une combinaison login\/password identique sauvegard\u00e9e dans la base de donn\u00e9e.Cette fonction va tester la correspondance des informations login \/ mot de passe dans la base de donn\u00e9es.<\/li>\n\n\n\n<li> La fonction \u00ab\u00a0isCompteActive\u00a0\u00bb retourne \u00ab\u00a0vrai\u00a0\u00bb si, alors que l&rsquo;utilisateur \u00e0 saisi une combinaison login\/password valide, le compte a de plus \u00e9t\u00e9 activ\u00e9 en r\u00e9ponse au mail de confirmation envoy\u00e9 par mail.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;.\/models\/MainManager.model.php&quot;);\n\nclass UtilisateurManager extends MainManager{\n\n    \/\/ getPasswordUser :    entr\u00e9e -&gt; nom de login \u00e0 rechercher dans la BD\n    \/\/                      sortie -&gt; nom crypt\u00e9 du password ou null\n    \/\/ la fonction effectue une requ\u00eate dans la BD sur le nom de login ($login).\n    \/\/ La variable $data contiendra les informations de l'enregistrement correspondant \n    \/\/ s'il est trouv\u00e9, &quot;null&quot; sinon.\n    private function getPasswordUser($login){\n        $req = &quot;SELECT password FROM utilisateur WHERE login = :login&quot;;\n        $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n        $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n        $stmt-&gt;execute();\n        $data = $stmt-&gt;fetch(PDO::FETCH_ASSOC);\n        $stmt-&gt;closeCursor();\n        return $data['password'];       \n    }\n\n    \/\/ isCombinaisonValide :    entr\u00e9e -&gt;   nom de login\n    \/\/                                      password (non crypt\u00e9)\n    \/\/                          sortie -&gt; vrai si concordance (login\/password) trouv\u00e9e en BD\n    public function isCombinaisonValide($login, $password){\n        \/\/ si le login existe dans la BD, $passwordBD contient le password crypt\u00e9 correspndant\n        $passwordBD = $this-&gt;getPasswordUser($login);\n        \/\/echo $passwordBD;\n        \/\/ password_verify renvoi &quot;true&quot; s'il y a correspondance entre chaine et chaine crypt\u00e9 \n        return password_verify($password, $passwordBD);\n    }\n\n    \/\/ getCompteActive :    entr\u00e9e -&gt; nom de login concern\u00e9\n    \/\/                      sortie -&gt; true si le champ &quot;est_valide&quot; est \u00e9gal \u00e0 1, z\u00e9ro sinon\n    public function isCompteActive($login){\n        $req = &quot;SELECT est_valide FROM utilisateur WHERE login = :login&quot;;\n        $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n        $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n        $stmt-&gt;execute();\n        $data = $stmt-&gt;fetch(PDO::FETCH_ASSOC);\n        $stmt-&gt;closeCursor();\n        return ((int)$data['est_valide'] === 1) ? true : false;\n    }\n}\n?&gt;<\/pre><\/div>\n\n\n\n<ul>\n<li>On cr\u00e9\u00e9 un fichier \u00ab\u00a0Utilisateur.controller.php\u00a0\u00bb \u00e0 la racine du dossier \u00ab\u00a0controllers\/Utilisateur\u00a0\u00bb. On d\u00e9finit la classe \u00ab\u00a0UtilisateurController\u00a0\u00bb (qui h\u00e9rite de la classe \u00ab\u00a0MainController\u00a0\u00bb), dans laquelle on cr\u00e9\u00e9 la fonction \u00ab\u00a0validationLogin\u00a0\u00bb.<br>Cette fonction va tester la correspondance des informations login \/ mot de passe dans la base de donn\u00e9es. On renverra un message d&rsquo;erreur si l&rsquo;utilisateur n&rsquo;apparait pas dans la BD (fonction isCombinaisonValide de la classe mod\u00e8le \u00ab\u00a0utilisateurManager\u00a0\u00bb) ou si l&rsquo;utilisateur existe pas que le compte n&rsquo;a pas \u00e9t\u00e9 encore activ\u00e9 (fonction isCompteActive de la classe mod\u00e8le \u00ab\u00a0utilisateurManager\u00a0\u00bb qui v\u00e9rifie si le compte a \u00e9t\u00e9 activ\u00e9 lors d&rsquo;une r\u00e9ponse \u00e0 l&rsquo;envoi du mail de confirmation).<br>Si l&rsquo;utilisateur devient connect\u00e9. on sauvegardera le nom de login dans une variable de session afin d&rsquo;\u00e9viter de faire \u00e0 chaque fois de nouvelles v\u00e9rifications inutiles. D\u00e9sormais, il suffira de v\u00e9rifier l&rsquo;\u00e9tat de la variable login pour savoir si un utilisateur est connect\u00e9 et connaitre son nom.<br>Sinon, la r\u00e9ponse est orient\u00e9 vers la page d&rsquo;affichage du profil utilisateur.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;.\/controllers\/MainController.controller.php&quot;);\nrequire_once(&quot;.\/models\/Utilisateur\/Utilisateur.model.php&quot;);\n\nclass UtilisateurController extends MainController {\n\n     private $utilisateurController;\n     private $utilisateurManager;\n\n    public function __construct(){\n        $this-&gt;utilisateurManager = new UtilisateurManager();\n    }\n\n    public function validationLogin($login, $password){\n\n        if($this-&gt;utilisateurManager-&gt;isCombinaisonValide($login, $password)){\n            \n            if($this-&gt;utilisateurManager-&gt;isCompteActive($login)){\n                Toolbox::ajouterMessageAlerte(&quot;Bon retour sur le site &quot;.$login. &quot; !&quot;, \n                    Toolbox::COULEUR_VERTE);\n              \t\/\/ Ssauvegarde du nom de login dans une variable de session\n                $_SESSION['profil'] = [\n                    &quot;login&quot; =&gt; $login\n                ];\n              \t\/\/ Redirection vers la page de profil utilisateur\n                header(&quot;Location: &quot;.URL.&quot;compte\/profil&quot;);    \n            }else{\n                $msg = &quot;Le compte &quot;.$login.&quot; n'a pas \u00e9t\u00e9 activ\u00e9 par mail. &quot;;\n                Toolbox::ajouterMessageAlerte($msg, Toolbox::COULEUR_ROUGE);\n                header(&quot;Location: &quot;.URL.&quot;login&quot;);    \n            }\n\n        } else {\n            Toolbox::ajouterMessageAlerte(&quot;Combinaison Login \/ Mot de passe non valide&quot;, \n                                            Toolbox::COULEUR_ROUGE);\n            header(&quot;Location: &quot;.URL.&quot;login&quot;);\n        };\n    }\n}\n?&gt;<\/pre><\/div>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">7. Page de profil<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-12c5b5\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">7. Page de profil<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Maintenant que l&rsquo;utilisateur est connect\u00e9, on veut cr\u00e9er une page contenant son profil.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<ul>\n<li>Pour pouvoir acc\u00e9der \u00e0 ce profil, on ajoutera un item \u00ab\u00a0Profil\u00a0\u00bb dans le menu. Cet item se affich\u00e9 seulement en cas de connexion \u00e9tablie. De m\u00eame, l&rsquo;item \u00ab\u00a0Se connecter\u00a0\u00bb cr\u00e9\u00e9 dans l&rsquo;\u00e9tape pr\u00e9c\u00e9dente sera affich\u00e9 uniquement en l&rsquo;absence de connexion.<br>Pour cela on va cr\u00e9er en premier, dans la classe \u00ab\u00a0Securite\u00a0\u00bb, la fonction isConnected() qui renvoie la valeur true si connect\u00e9, false sinon.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Securite.class.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nclass Securite{\n  ...\n    public static function isConnected(){\n        return (!empty($_SESSION['profil']));\n    }\n}\n?&gt;<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;menu.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php if(!Securite::isConnected()) : ?&gt;\n  &lt;li class=&quot;nav-item&quot;&gt;\n    &lt;a class=&quot;nav-link&quot; aria-current=&quot;page&quot; href=&quot;&lt;?= URL; ?&gt;login&quot;&gt;Se connecter&lt;\/a&gt;\n  &lt;\/li&gt;\n&lt;?php else : ?&gt;\n  &lt;li class=&quot;nav-item&quot;&gt;\n    &lt;a class=&quot;nav-link&quot; aria-current=&quot;page&quot; href=&quot;&lt;?= URL; ?&gt;compte\/profil&quot;&gt;Profil&lt;\/a&gt;\n  &lt;\/li&gt;\n&lt;?php endif; ?&gt;\n<\/pre><\/div>\n\n\n\n<ul>\n<li>Dans le fichier de routage \u00ab\u00a0index.php\u00a0\u00bb, on va simplement appeler la fonction profil qui sera cr\u00e9er dans contr\u00f4leur des utilisateurs. Attention cependant, \u00ab\u00a0profil\u00a0\u00bb sera appel\u00e9 \u00e0 partir de \u00ab\u00a0compte\u00a0\u00bb (&#8230;\/compte\/profil). L&rsquo;acc\u00e8s dans la hi\u00e9rarchie est donc sensiblement diff\u00e9rente.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;compte&quot; : \n    switch($url[1]){\n        case &quot;profil&quot;: $utilisateurController-&gt;profil();\n        break;\n    }\nbreak;\ndefault : throw new Exception(&quot;La page n'existe pas&quot;);<\/pre><\/div>\n\n\n\n<ul>\n<li>Dans le fichier \u00ab\u00a0Utilisateur.model.php\u00a0\u00bb \/ classe \u00ab\u00a0UtilisateurManager\u00a0\u00bb on cr\u00e9\u00e9 une fonction getUserInformation ($login) qui renvoie un tableau ($datas) contenant les donn\u00e9es du profil de l&rsquo;utilisateur ($login) \u00e0 partir d&rsquo;une requ\u00eatre SQL.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">    public function getUserInformation($login){\n        $req = &quot;SELECT * FROM utilisateur WHERE login = :login&quot;;\n        $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n        $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n        $stmt-&gt;execute();\n        $datas = $stmt-&gt;fetch(PDO::FETCH_ASSOC);\n        $stmt-&gt;closeCursor();\n        return $datas;\n    }<\/pre><\/div>\n\n\n\n<ul>\n<li>Dans le contr\u00f4leur \u00ab\u00a0Utilisateur.controller.php\u00a0\u00bb \/ classe \u00ab\u00a0UtilisateurController\u00a0\u00bb on cr\u00e9er une fonction profil() qui va r\u00e9cup\u00e9rer les informations d&rsquo;un utilisateur (tableau $datas) aupr\u00e8s du mod\u00e8le (fonction getUserInformation), pr\u00e9parer la structure de donn\u00e9es afin que la vue (profil.view.php) puisse afficher les donn\u00e9es de profil.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function profil(){\n    $datas = $this-&gt;utilisateurManager-&gt;getUserInformation($_SESSION['profil']['login']);\n    $_SESSION['profil'][&quot;mail&quot;] = $datas['mail'];\n    $_SESSION['profil'][&quot;role&quot;] = $datas['role'];\n\n    $data_page = [\n        &quot;page_description&quot; =&gt; &quot;Page de profil&quot;,\n        &quot;page_title&quot; =&gt; &quot;Page de profil&quot;,\n        &quot;view&quot; =&gt; &quot;views\/Utilisateur\/profil.view.php&quot;,\n        &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n    ];\n    $this-&gt;genererPage($data_page);\n}<\/pre><\/div>\n\n\n\n<ul>\n<li>La vue sera simple dans un premier temps et affichera seulement le nom et l&rsquo;adresse mail de l&rsquo;utilisateur connect\u00e9.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;views\/Visiteur\/login.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;h1&gt;Profil de &lt;b&gt;&lt;?= $_SESSION['profil']['login'] ?&gt;&lt;\/b&gt;&lt;\/h1&gt;\n&lt;div id=&quot;mail&quot;&gt;\n  Mail : &lt;?= $_SESSION['profil']['mail'] ?&gt;\n&lt;\/div&gt;<\/pre><\/div>\n\n\n\n<p>R\u00e9sultat :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"197\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-13-1024x197.png\" alt=\"\" class=\"wp-image-2460\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-13-1024x197.png 1024w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-13-300x58.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-13-768x148.png 768w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-13.png 1061w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">8. Deconnexion<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-736b1b\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">8. D\u00e9connexion<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Maintenant que l&rsquo;utilisateur est connect\u00e9, on veut acc\u00e9der \u00e0 un lien r\u00e9alisant la d\u00e9connexion.<\/p>\n\n\n\n<ul>\n<li>On ajoutera un item \u00ab\u00a0Se d\u00e9connecter\u00a0\u00bb dans le menu. Cet item se affich\u00e9 seulement en cas de connexion \u00e9tablie.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;menu.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php if(!Securite::isConnected()) : ?&gt;\n  &lt;li class=&quot;nav-item&quot;&gt;\n    &lt;a class=&quot;nav-link&quot; aria-current=&quot;page&quot; href=&quot;&lt;?= URL; ?&gt;login&quot;&gt;Se connecter&lt;\/a&gt;\n  &lt;\/li&gt;\n&lt;?php else : ?&gt;\n  &lt;li class=&quot;nav-item&quot;&gt;\n    &lt;a class=&quot;nav-link&quot; aria-current=&quot;page&quot; href=&quot;&lt;?= URL; ?&gt;compte\/profil&quot;&gt;Profil&lt;\/a&gt;\n  &lt;\/li&gt;\n  &lt;li class=&quot;nav-item&quot;&gt;\n    &lt;a class=&quot;nav-link&quot; aria-current=&quot;page&quot; href=&quot;&lt;?= URL; ?&gt;compte\/deconnexion&quot;&gt;Se d\u00e9connecter&lt;\/a&gt;\n  &lt;\/li&gt;\n&lt;?php endif; ?&gt;\n<\/pre><\/div>\n\n\n\n<ul>\n<li><\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;compte&quot; : \n    switch($url[1]){\n        case &quot;profil&quot;: $utilisateurController-&gt;profil();\n        break;\n        case &quot;deconnexion&quot;: $utilisateurController-&gt;deconnexion();\n        break;\n    }\nbreak;\ndefault : throw new Exception(&quot;La page n'existe pas&quot;);<\/pre><\/div>\n\n\n\n<ul>\n<li><\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function deconnexion(){\n    Toolbox::ajouterMessageAlerte(&quot;La d\u00e9connexion est effectu\u00e9e&quot;, Toolbox::COULEUR_VERTE);\n    unset($_SESSION['profil']);\n    header(&quot;Location: &quot;.URL.&quot;accueil&quot;);\n}<\/pre><\/div>\n\n\n\n<ul>\n<li><\/li>\n<\/ul>\n\n\n\n<p>R\u00e9sultat :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"279\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-14-1024x279.png\" alt=\"\" class=\"wp-image-2464\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-14-1024x279.png 1024w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-14-300x82.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-14-768x209.png 768w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-14.png 1053w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">9. S\u00e9curisation de la partie \u00ab\u00a0utilisateur\u00a0\u00bb<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-bca9c9\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">9. S\u00e9curisation de la partie \u00ab\u00a0utilisateur\u00a0\u00bb<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Maintenant que l&rsquo;utilisateur est connect\u00e9, on veut acc\u00e9der \u00e0 un lien r\u00e9alisant la d\u00e9connexion.<\/p>\n\n\n\n<ul>\n<li>Pour acc\u00e9der aux parties de site n\u00e9cessitant un utilisateur connect\u00e9, on va faire la v\u00e9rification au niveau du routeur.<\/li>\n\n\n\n<li>Pour savoir si un utilisateur est connect\u00e9, il suffit de regarder si $SESSION[&lsquo;profil&rsquo;] n&rsquo;est pas vide.<\/li>\n\n\n\n<li>Avec le protocole HTTPS, il est difficile de cracker une session. Cependant, on doit actualiser ses connaissance en mati\u00e8re de s\u00e9curit\u00e9.<\/li>\n<\/ul>\n\n\n\n<p>Remarque : L&rsquo;avantage d&rsquo;\u00e9crire le code de v\u00e9rification de la connexion au niveau du routeur est d&rsquo;\u00e9viter de le dupliquer dans chacune des fonctions du contr\u00f4leur.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Securite.class.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public static function isConnected(){\n    return (!empty($_SESSION['profil']));\n}<\/pre><\/div>\n\n\n\n<ul>\n<li>C&rsquo;est au niveau de \u00ab\u00a0compte\u00a0\u00bb qu&rsquo;il est pertinent de mettre en place le test de connexion puisque l&rsquo;acc\u00e8s \u00e0 ce niveau de devrait \u00eatre possible que lorsqu&rsquo;il y a une authentification pr\u00e9alable.<br>Si l&rsquo;utilisateur tente d&rsquo;acc\u00e9der \u00e0 n&rsquo;importe quelle page de compte restreinte \u00e0 l&rsquo;authentification pr\u00e9alable, on affiche le message \u00ab\u00a0Veuillez vous connecter !\u00a0\u00bb et on rediriger la page vers celle de \u00ab\u00a0login\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;compte&quot; : \n    if(!Securite::isConnected()){\n        Toolbox::ajouterMessageAlerte(&quot;Veuillez vous connecter !&quot;, \n            Toolbox::COULEUR_ROUGE);\n        header('Location: '.URL.&quot;login&quot;);\n    } else {\n        switch($url[1]){\n            case &quot;profil&quot;: $utilisateurController-&gt;profil();\n            break;\n            case &quot;deconnexion&quot;: $utilisateurController-&gt;deconnexion();\n            break;\n        }\n    }\nbreak;\ndefault : throw new Exception(&quot;La page n'existe pas&quot;);<\/pre><\/div>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">10. Cr\u00e9ation de compte<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-120d97\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">10. Cr\u00e9ation de compte<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va construire le formulaire qui va permettre au visiteur de se cr\u00e9er un compte.<\/p>\n\n\n\n<ul>\n<li>On ajoutera un item \u00ab\u00a0Cr\u00e9er un compte\u00a0\u00bb dans le menu. Cet item se affich\u00e9 seulement en l&rsquo;absence de connexion \u00e9tablie.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;menu.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php if(!Securite::isConnected()) : ?&gt;\n  &lt;li class=&quot;nav-item&quot;&gt;\n    &lt;a class=&quot;nav-link&quot; aria-current=&quot;page&quot; href=&quot;&lt;?= URL; ?&gt;login&quot;&gt;Se connecter&lt;\/a&gt;\n  &lt;\/li&gt;\n  &lt;li class=&quot;nav-item&quot;&gt;\n    &lt;a class=&quot;nav-link&quot; aria-current=&quot;page&quot; href=&quot;&lt;?= URL; ?&gt;creerCompte&quot;&gt;Cr\u00e9er un compte&lt;\/a&gt;\n  &lt;\/li&gt;<\/pre><\/div>\n\n\n\n<ul>\n<li>On ajoute une nouvelle route dans le routeur (creerCompte) qui appellera \u00e0 partir du \u00ab\u00a0visiteurController\u00a0\u00bb la fonction \u00ab\u00a0creerCompte()\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">        case &quot;creerCompte&quot; : $visiteurController-&gt;creerCompte();\n        break;<\/pre><\/div>\n\n\n\n<ul>\n<li>La fonction \u00ab\u00a0creerCompte\u00a0\u00bb permettra simplement d&rsquo;envoyer les diff\u00e9rents \u00e9l\u00e9ments \u00e0 la vue qui se chargera d&rsquo;afficher le formulaire de cr\u00e9ation de compte.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Visiteur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function creerCompte(){\n    $data_page = [\n        &quot;page_description&quot; =&gt; &quot;Cr\u00e9ation d'un compte&quot;,\n        &quot;page_title&quot; =&gt; &quot;Cr\u00e9ation d'un compte&quot;,\n        &quot;view&quot; =&gt; &quot;views\/Visiteur\/creerCompte.view.php&quot;,\n        &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n    ];\n    $this-&gt;genererPage($data_page);\n}<\/pre><\/div>\n\n\n\n<ul>\n<li>La vue est un formulaire bootstrap classique.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;views\/Visiteur\/creerCompte.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;h1&gt;Cr\u00e9er un compte !&lt;\/h1&gt;\n&lt;form method=&quot;POST&quot; action=&quot;validation_creerCompte&quot;&gt;\n&lt;div class=&quot;mb-3&quot;&gt;\n    &lt;label for=&quot;login&quot; class=&quot;form-label&quot;&gt;Login&lt;\/label&gt;\n    &lt;input type=&quot;text&quot; class=&quot;form-control&quot; id='login' name=&quot;login&quot; placeholder=&quot;Entrer un nom de login&quot;&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;mb-3&quot;&gt;\n    &lt;label for=&quot;mail&quot; class=&quot;form-label&quot;&gt;mail&lt;\/label&gt;\n    &lt;input type=&quot;text&quot; class=&quot;form-control&quot; id='mail' name=&quot;mail&quot; placeholder=&quot;Entrer une adresse email valide&quot;&gt;\n  &lt;\/div&gt;\n  &lt;div class=&quot;mb-3&quot;&gt;\n    &lt;label for=&quot;password&quot; class=&quot;form-label&quot;&gt;Password&lt;\/label&gt;\n    &lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;password&quot; name=&quot;password&quot;&gt;\n  &lt;\/div&gt;\n    &lt;div class=&quot;text-muted&quot;&gt;Votre compte ne sera valide qu'apr\u00e8s la v\u00e9rification par mail effectu\u00e9e.&lt;\/div&gt;\n    &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;Cr\u00e9er !&lt;\/button&gt;\n&lt;\/form&gt;<\/pre><\/div>\n\n\n\n<ul>\n<li>Avant de terminer on ajoute dans le routeur la captation de l&rsquo;envoi du formulaire sp\u00e9cifi\u00e9 par la chaine \u00ab\u00a0validation_creerCompte\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">        case &quot;creerCompte&quot; : $visiteurController-&gt;creerCompte();\n        break;\n\t\tcase &quot;validation_creerCompte&quot; : echo &quot;test&quot;;\n\t\tbreak;<\/pre><\/div>\n\n\n\n<p>R\u00e9sultat :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1000\" height=\"367\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-15.png\" alt=\"\" class=\"wp-image-2467\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-15.png 1000w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-15-300x110.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-15-768x282.png 768w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">11. Validation de cr\u00e9ation de compte<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-2435e9\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">11. Validation de cr\u00e9ation de compte<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va programmer la fonction de validation des informations de cr\u00e9ation de compte renvoy\u00e9es par le formulaire. Ces informations vont permettre de cr\u00e9er un compte dans la base de donn\u00e9es. Pour cela, on ajoutera dans le contr\u00f4leur utilisateur la fonction \u00ab\u00a0validation_creerCompte\u00a0\u00bb en lui passant en param\u00e8tre les informations de nom de login, mot de passe et adresse mail.<\/p>\n\n\n\n<ul>\n<li>Avant de d\u00e9clencher l&rsquo;envoie des informations de cr\u00e9ation de compte au contr\u00f4leur, on v\u00e9rifie que les champs login, password et mail sont renseign\u00e9s.  <\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;validation_creerCompte&quot; :\n    if(!empty ($_POST['login']) &amp;&amp; !empty($_POST['password']) &amp;&amp; !empty($_POST['mail'])){\n        $login = Securite::secureHTML($_POST['login']);\n        $mail = Securite::secureHTML($_POST['mail']);\n        $password = Securite::secureHTML($_POST['password']);\n        $utilisateurController-&gt;validation_creerCompte($login, $password, $mail);\n    } else {\n        Toolbox::ajouterMessageAlerte(&quot;Les trois informations sont obligatoires !&quot;, \n            Toolbox::COULEUR_ROUGE);\n        header('Location: '.URL.&quot;creerCompte&quot;);\n    };\nbreak;\n<\/pre><\/div>\n\n\n\n<ul>\n<li>Dans le mod\u00e8le on cr\u00e9\u00e9 deux fonctions qui seront appel\u00e9es par le contr\u00f4leur :\n<ul>\n<li>La fonction \u00ab\u00a0verifLoginDisponible\u00a0\u00bb test si le nom de login est d\u00e9j\u00e0 utilis\u00e9 et stock\u00e9 dans la base de donn\u00e9es.<\/li>\n\n\n\n<li>La fonction \u00ab\u00a0bdCreerCompte\u00a0\u00bb ajoute un nouveau compte dans la base de donn\u00e9es.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">    public function verifLoginDisponible($login){\n        $utilisateur = $this-&gt;getUserInformation($login);\n        return empty($utilisateur);\n    }\n\n    public function bdCreerCompte($login, $passwordCrypte, $mail, $clef){\n        $req= &quot;INSERT INTO utilisateur (login, password, mail, est_valide, role, clef)\n        VALUES (:login, :password, :mail, 0, :clef)&quot;;\n        $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n        $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n        $stmt-&gt;bindValue(&quot;:password&quot;, $passwordCrypte, PDO::PARAM_STR);\n        $stmt-&gt;bindValue(&quot;:mail&quot;, $mail, PDO::PARAM_STR);\n        $stmt-&gt;bindValue(&quot;:clef&quot;, $clef, PDO::PARAM_INT);\n        $stmt-&gt;execute();\n        $estAjouter = ($stmt-&gt;rowCount() &gt; 0);\n        $stmt-&gt;closeCursor();\n        return $estAjouter;\n    }<\/pre><\/div>\n\n\n\n<ul>\n<li>Le contr\u00f4leur v\u00e9rifie que le login est disponible. Si ce n&rsquo;est pas le cas, on affiche le message \u00ab\u00a0Le login est d\u00e9j\u00e0 utilis\u00e9\u00a0\u00bb et on redirige la demande vers le formulaire de cr\u00e9ation de compte.<br>Sinon, passe \u00e0 la cr\u00e9ation du compte. Pour cela il faudra g\u00e9n\u00e9rer un password crypt\u00e9 \u00e0 partir du mot de passe utilisateur envoy\u00e9 dans le formulaire. On va ensuite g\u00e9n\u00e9rer une cl\u00e9 (nombre al\u00e9atoire) qui sera utilis\u00e9 dans le processus de validation par mail.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validation_creerCompte($login, $password, $mail){\n    if($this-&gt;utilisateurManager-&gt;verifLoginDisponible($login)){\n        $passwordCrypte = password_hash($password, PASSWORD_DEFAULT);\n        $clef = rand(0,9999);\n        if($this-&gt;utilisateurManager-&gt;bdCreerCompte($login, $passwordCrypte, $mail, $clef)){\n            \/\/$this-&gt;sendMailValidation($login, $mail, $clef);\n            Toolbox::ajouterMessageAlerte(&quot;Le compte a \u00e9t\u00e9 cr\u00e9\u00e9, validez le mail envoy\u00e9 pour valider le compte !&quot;, \n            Toolbox::COULEUR_VERTE);\n            header(&quot;Location: &quot;.URL.&quot;login&quot;);                    \n\n        } else {\n            Toolbox::ajouterMessageAlerte(&quot;Erreur lors de la cr\u00e9ation du compte, veuillez recommencer !&quot;, \n            Toolbox::COULEUR_ROUGE);\n            header(&quot;Location: &quot;.URL.&quot;creerCompte&quot;);                    \n        }\n    } else {\n        Toolbox::ajouterMessageAlerte(&quot;Le login &quot;.$login.&quot; est d\u00e9j\u00e0 utilis\u00e9&quot;, \n        Toolbox::COULEUR_ROUGE);\n        header(&quot;Location: &quot;.URL.&quot;creerCompte&quot;);\n    }\n}\n<\/pre><\/div>\n\n\n\n<ul>\n<li><\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">12. Envoi du mail de validation<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-23175d\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">12. Envoi du mail de validation<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Si l&rsquo;on se r\u00e9f\u00e8re \u00e0 l&rsquo;\u00e9tape pr\u00e9c\u00e9dente, lors de la validation du formulaire de cr\u00e9ation de compte, on veut envoyer un mail de validation \u00e0 l&rsquo;adresse indiqu\u00e9 par l&rsquo;utilisateur.<\/p>\n\n\n\n<ul>\n<li>On va cr\u00e9er une fonction dans la classe \u00ab\u00a0Toolbox\u00a0\u00bb qui enverra un mail \u00e0 un destinataire<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;controllers\/Toolbox.class.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public static function sendMail($destinataire, $sujet, $message){\n    $headers = &quot;From: nom.user@gmail.com&quot;;\n    if(mail($destinataire, $sujet, $message, $headers)){\n        self::ajouterMessageAlerte(&quot;Mail envoy\u00e9&quot;, self::COULEUR_VERTE);\n    } else {\n        self::ajouterMessageAlerte(&quot;Mail non envoy\u00e9&quot;, self::COULEUR_ROUGE);\n    }\n}<\/pre><\/div>\n\n\n\n<ul>\n<li>Dans le contr\u00f4leur utilisateur (Utilisateur.Controller.php), on \u00e9crit maintenant la fonction qui va composer le contenu du message de validation.<br>La composition de l&rsquo;adresse de v\u00e9rification ($urlVerification) correspond \u00e0 l&rsquo;adresse du site \u00e0 laquelle on ajoute le nom de routage \u00ab\u00a0validation_mailCompte\/\u00a0\u00bb concat\u00e9n\u00e9 avec le nom de login \/ le num\u00e9ro de la cl\u00e9 (choisie al\u00e9atoirement).<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">private function sendMailValidation($login, $mail, $clef){\n    $urlVerification = URL.&quot;validation_mailCompte\/&quot;.$login.&quot;\/&quot;.$clef;\n    $sujet = &quot;Cr\u00e9ation du compte sur le site xxx&quot;;\n    $message = &quot;Pour valider votre compte veuillez cliquer sur le lien suivant &quot;.$urlVerification;\n    Toolbox::sendMail($mail, $sujet, $message);\n}<\/pre><\/div>\n\n\n\n<ul>\n<li>Toujours dans le contr\u00f4leur utilisateur, fonction \u00ab\u00a0validation_creerCompte\u00a0\u00bb,  si la sauvegarde du nouveau compte dans la base de donn\u00e9es c&rsquo;est bien pass\u00e9, on lance l&rsquo;envoi du mail en appelant la fonction sendMailValidation (ligne 6)\n<ul>\n<li><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validation_creerCompte($login, $password, $mail){\n    if($this-&gt;utilisateurManager-&gt;verifLoginDisponible($login)){\n        $passwordCrypte = password_hash($password, PASSWORD_DEFAULT);\n        $clef = rand(0,9999);\n        if($this-&gt;utilisateurManager-&gt;bdCreerCompte($login, $passwordCrypte, $mail, $clef)){\n            $this-&gt;sendMailValidation($login, $mail, $clef);\n            Toolbox::ajouterMessageAlerte(&quot;Le compte a \u00e9t\u00e9 cr\u00e9\u00e9, validez le mail envoy\u00e9 pour valider le compte !&quot;, \n            Toolbox::COULEUR_VERTE);\n            header(&quot;Location: &quot;.URL.&quot;login&quot;);                    \n...<\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-1cf2137e\"><div class=\"uagb-heading-text\">Renvoi du mail de validation<\/div><\/div>\n\n\n\n<p>Apr\u00e8s la cr\u00e9ation de compte, l&rsquo;utilisateur ne peut pas encore se connecter \u00e0 son compte car il n&rsquo;est pas encore activ\u00e9. Pour l&rsquo;activer, l&rsquo;utilisateur doit r\u00e9pondre au mail envoy\u00e9 en cliquant sur le lien de confirmation de compte.<\/p>\n\n\n\n<p>Si l&rsquo;utilisateur tente de se connecter sans avoir activ\u00e9 son compte, on va faire en sorte de lui rappeler d&rsquo;activer son compte par un message d&rsquo;erreur et en lui permettant de commander le renvoi du mail de confirmation de compte.<\/p>\n\n\n\n<ul>\n<li>Pour faire cela, dans le fichier \u00ab\u00a0Utilisateur.controller.php\u00a0\u00bb, on va modifier la fonction \u00ab\u00a0validation_login\u00a0\u00bb. On ajoute la ligne 19 on l&rsquo;on cr\u00e9\u00e9 d&rsquo;un lien (nouvelle route : \u00ab\u00a0renvoyerMailValidation\/[nom_login]\u00a0\u00bb) permettant \u00e0 l&rsquo;utilisateur de commander le renvoi du mail de validation.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validationLogin($login, $password){\n\n    if($this-&gt;utilisateurManager-&gt;isCombinaisonValide($login, $password)){\n\n        if($this-&gt;utilisateurManager-&gt;isCompteActive($login)){\n            Toolbox::ajouterMessageAlerte(&quot;Bon retour sur le site &quot;.$login. &quot; !&quot;, \n                Toolbox::COULEUR_VERTE);\n\n            \/\/ Ssauvegarde du nom de login dans une variable de session\n            $_SESSION['profil'] = [\n                &quot;login&quot; =&gt; $login\n            ];\n            \/\/ Redirection vers la page de profil utilisateur\n            header(&quot;Location: &quot;.URL.&quot;compte\/profil&quot;);    \n        }else{\n            $msg = &quot;Le compte &quot;.$login.&quot; n'a pas \u00e9t\u00e9 activ\u00e9 par mail. &quot;;\n            \/\/ Cr\u00e9ation d'un lien permettant \u00e0 l'utilisateur de commander le renvoi du mail de validation\n            \/\/ On cr\u00e9\u00e9 la nouvelle route &quot;renvoyerMailValidation\/&quot; en concat\u00e9nant le nom de login.\n          \t$msg .= &quot;&lt;a href='renvoyerMailValidation\/&quot;.$login.&quot;'&gt;Renvoyer le mail de validation&lt;\/a&gt;&quot;;\n            Toolbox::ajouterMessageAlerte($msg, Toolbox::COULEUR_ROUGE);\n            header(&quot;Location: &quot;.URL.&quot;login&quot;);    \n        }\n\n    } else {\n        Toolbox::ajouterMessageAlerte(&quot;Combinaison Login \/ Mot de passe non valide&quot;, \n                                        Toolbox::COULEUR_ROUGE);\n        header(&quot;Location: &quot;.URL.&quot;login&quot;);\n    };\n}<\/pre><\/div>\n\n\n\n<ul>\n<li>Toujours dans la classe \u00ab\u00a0UtilisateurController\u00a0\u00bb, par anticipation, on ajoute la fonction \u00ab\u00a0renvoyerMailValidation\u00a0\u00bb qui va, apr\u00e8s avoir r\u00e9cup\u00e9rer dans la base de donn\u00e9es les informations \u00ab\u00a0mail\u00a0\u00bb et \u00ab\u00a0clef\u00a0\u00bb (\u00e0 partir du \u00ab\u00a0login\u00a0\u00bb), renvoyer le mail de validation de compte. <\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.Controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function renvoyerMailValidation($login){\n    \/\/ On r\u00e9cup\u00e8re les informations de l'utilisateur dans la BD...\n    $user = $this-&gt;utilisateurManager-&gt;getUserInformation($login);\n    \/\/ afin de r\u00e9cup\u00e9rer les informations &quot;mail&quot; et &quot;cl\u00e9&quot; n\u00e9cessaire au renvoi du mail de validation\n    $this-&gt;sendMailValidation($login, $user['mail'], $user['clef']);\n    header('Location: '.URL.&quot;login&quot;);      \n}<\/pre><\/div>\n\n\n\n<ul>\n<li>Dans le routeur \u00ab\u00a0index.php\u00a0\u00bb, on g\u00e8re la nouvelle route \u00ab\u00a0renvoyerMailValidation\u00a0\u00bb en appelant la fonction \u00ab\u00a0renvoyerMailValidation\u00a0\u00bb de la classe \u00ab\u00a0UtilisateurController\u00a0\u00bb cr\u00e9\u00e9 pr\u00e9c\u00e9demment (ligne 6) :<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;creerCompte&quot; : $visiteurController-&gt;creerCompte();\n    break;\ncase &quot;validation_creerCompte&quot; :\n\t...\n    break;\ncase &quot;renvoyerMailValidation&quot; : $utilisateurController-&gt;renvoyerMailValidation($url[1]);\n    break;\ncase &quot;compte&quot; : <\/pre><\/div>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-b07c530e\"><div class=\"uagb-heading-text\">R\u00e9sultat<\/div><\/div>\n\n\n\n<p>S\u00e9lection du menu \u00ab\u00a0Cr\u00e9er un compte\u00a0\u00bb : On rempli le formulaire&#8230;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"700\" height=\"330\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-16.png\" alt=\"\" class=\"wp-image-2476\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-16.png 700w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-16-300x141.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>et on clic sur le bouton \u00ab\u00a0Cr\u00e9er\u00a0\u00bb<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"500\" height=\"410\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-17-1.png\" alt=\"\" class=\"wp-image-2479\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-17-1.png 500w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-17-1-300x246.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/figure>\n\n\n\n<p>Dans le m\u00eame temps on re\u00e7oit le mail de validation de compte :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"500\" height=\"238\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-19.png\" alt=\"\" class=\"wp-image-2478\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-19.png 500w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-19-300x143.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/figure>\n\n\n\n<p>Et si on tente de se connecter sans avoir activ\u00e9 son compte :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"550\" height=\"341\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-18.png\" alt=\"\" class=\"wp-image-2480\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-18.png 550w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-18-300x186.png 300w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">13. Validation du compte par mail<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-25d32e\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">13. Validation du compte par mail<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Lorsque l&rsquo;utilisateur s\u00e9lectionne le lien de validation de compte \u00e0 l&rsquo;int\u00e9rieur du mail re\u00e7us, le routeur re\u00e7oit le message sur la route \u00ab\u00a0validationMail\u00a0\u00bb. Il doit alors d\u00e9clencher la finalisation du compte en l&rsquo;activant. Pour activer le compte, il faut affecter la valeur 1 au champ \u00ab\u00a0est_valide\u00a0\u00bb de la table \u00ab\u00a0utilisateur\u00a0\u00bb de l&rsquo;utilisateur (mail) dans la base de donn\u00e9e.<\/p>\n\n\n\n<p>Pour cela, le routeur devra appeler la m\u00e9thode \u00ab\u00a0validation_mailCompte\u00a0\u00bb de la classe \u00ab\u00a0UtilisateurController\u00a0\u00bb qui demandera au mod\u00e8le (classe \u00ab\u00a0UtilisateurManager\u00a0\u00bb) de modifier la base de donn\u00e9es (m\u00e9thode \u00ab\u00a0bdValidationMail\u00a0\u00bb).<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;validation_mailCompte&quot; : $utilisateurController-&gt;validation_mailCompte($url[1], $url[2]);\n    break;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validation_mailCompte($login, $clef){\n    if($this-&gt;utilisateurManager-&gt;bdValidationMail($login, $clef)){\n        Toolbox::ajouterMessageAlerte(&quot;Le compte a \u00e9t\u00e9 activ\u00e9 !&quot;,Toolbox::COULEUR_VERTE);\n        header(&quot;Location: &quot;.URL.&quot;login&quot;);\n    } else {\n        Toolbox::ajouterMessageAlerte(&quot;Le compte n'a pas pu \u00eatre valid\u00e9 !&quot;,Toolbox::COULEUR_ROUGE);\n        header(&quot;Location: &quot;.URL.&quot;creerCompte&quot;);\n    }\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function bdValidationMail($login, $clef){\n    \/\/ Test sur la valeur de la cl\u00e9 et affectation du flag est_valide dans la foul\u00e9e (si test positif)\n    $req= 'UPDATE utilisateur set est_valide = 1 WHERE login = :login and clef = :clef';\n    $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n    $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:clef&quot;, $clef, PDO::PARAM_INT);\n    $stmt-&gt;execute();\n    $estModifier = ($stmt-&gt;rowCount() &gt; 0);\n    $stmt-&gt;closeCursor();\n    return $estModifier;\n}<\/pre><\/div>\n\n\n\n<ul>\n<li><\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">14. Modification du mail<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-815f1d\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">14. Modification du mail<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va ajouter un bouton a c\u00f4t\u00e9 du mail qui est affich\u00e9 sur la page de profil, et lors du clic sur ce bouton, on affichera a la place du mail un champ pour le modifier ainsi qu&rsquo;un bouton de validation (on utilisera du code JavaScript client).<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function profil(){\n    $datas = $this-&gt;utilisateurManager-&gt;getUserInformation($_SESSION['profil']['login']);\n    $_SESSION['profil'][&quot;role&quot;] = $datas['role'];\n    \/\/print_r($datas);\n\n    $data_page = [\n        &quot;page_description&quot; =&gt; &quot;Page de profil&quot;,\n        &quot;page_title&quot; =&gt; &quot;Page de profil&quot;,\n        &quot;utilisateur&quot; =&gt; $datas,\n        \/\/ page_javascript -&gt; fonctionne avec le script \u00e0 la fin de views\/common\/template.php\n        \/\/ 'profil.js' se trouve dans public\/javascript\/\n        &quot;page_javascript&quot; =&gt; ['profil.js'],\n        &quot;view&quot; =&gt; &quot;views\/Utilisateur\/profil.view.php&quot;,\n        &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n    ];\n    $this-&gt;genererPage($data_page);\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;profil.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;h1&gt;Profil de &lt;?= $utilisateur['login'] ?&gt;&lt;\/h1&gt;\n&lt;div id=&quot;mail&quot;&gt;\n    Mail : &lt;?= $utilisateur['mail'] ?&gt;\n    &lt;button class=&quot;btn btn-primary&quot; id=&quot;btnModifMail&quot;&gt;\n        &lt;svg xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; class=&quot;bi bi-pencil&quot; viewBox=&quot;0 0 16 16&quot;&gt;\n            &lt;path d=&quot;M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0 0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168l10-10zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207 11.207 2.5zm1.586 3L10.5 3.207 4 9.707V10h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.293l6.5-6.5zm-9.761 5.175-.106.106-1.528 3.821 3.821-1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325z&quot;\/&gt;\n        &lt;\/svg&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;\n\n&lt;div id=&quot;modificationMail&quot; class=&quot;d-none&quot;&gt;\n    &lt;form method=&quot;POST&quot; action=&quot;&lt;?= URL; ?&gt;compte\/validation_modificationMail&quot;&gt;\n        &lt;div class=&quot;row&quot;&gt;\n            &lt;label for=&quot;mail&quot; class=&quot;col-2 col-form-label&quot;&gt;Mail :&lt;\/label&gt;\n            &lt;div class=&quot;col-8&quot;&gt;\n                &lt;input type=&quot;mail&quot; class=&quot;form-control&quot; name=&quot;mail&quot; value=&quot;&lt;?= $utilisateur['mail'] ?&gt;&quot; \/&gt;\n            &lt;\/div&gt;\n            &lt;div class=&quot;col-2&quot;&gt;\n                &lt;button class=&quot;btn btn-success&quot; id=&quot;btnValidModifMail&quot; type=&quot;submit&quot;&gt;\n                    &lt;svg xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; class=&quot;bi bi-check&quot; viewBox=&quot;0 0 16 16&quot;&gt;\n                        &lt;path d=&quot;M10.97 4.97a.75.75 0 0 1 1.07 1.05l-3.99 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.267.267 0 0 1 .02-.022z&quot;\/&gt;\n                    &lt;\/svg&gt;\n                &lt;\/button&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n    &lt;\/form&gt;\n&lt;\/div&gt;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;javascript&quot;,&quot;mime&quot;:&quot;text\/javascript&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;script.js&quot;,&quot;language&quot;:&quot;JavaScript&quot;,&quot;modeName&quot;:&quot;js&quot;}\">\/\/ R\u00e9cup\u00e8re un pointeur sur le bouton de demande de modif : id = btnModifMail\nlet btnModifMail = document.querySelector(&quot;#btnModifMail&quot;);\n\/\/ Pointeur sur le bouton de validation de modif : id = btnValidModifMail\nlet btnValidModifMail = document.querySelector(&quot;#btnValidModifMail&quot;);\n\/\/ Pointeur sur la &lt;div&gt; sup\u00e9rieure : &lt;div id=&quot;mail&quot;&gt;\nlet divMail = document.querySelector(&quot;#mail&quot;);\n\/\/ Pointeur sur la &lt;div&gt; inf\u00e9rieure : &lt;div id=&quot;modificationMail&quot;&gt;\nlet divModificationMail = document.querySelector(&quot;#modificationMail&quot;);\n\n\/\/ Si on clique sur le bounton de demande de modif :  \n\/\/      - on masque masque la div sup\u00e9rieure\n\/\/      - on affiche la div inf\u00e9rieure\nbtnModifMail.addEventListener(&quot;click&quot;, function(){\n    divMail.classList.add(&quot;d-none&quot;);\n    divModificationMail.classList.remove(&quot;d-none&quot;);\n})<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"837\" height=\"97\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-21.png\" alt=\"\" class=\"wp-image-2489\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-21.png 837w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-21-300x35.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-21-768x89.png 768w\" sizes=\"(max-width: 837px) 100vw, 837px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">15. Validation de la modification du mail<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-568bcc\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">15. Validation de la modification du mail<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va maintenant g\u00e9rer la soumission de la modification de l&rsquo;adresse mail initi\u00e9 dans l&rsquo;\u00e9tape pr\u00e9c\u00e9dente. <\/p>\n\n\n\n<p>La m\u00e9thode est la suivante :<\/p>\n\n\n\n<ul>\n<li>Routeur : Prise en compte de la route \u00ab\u00a0validation_modificationMail\u00a0\u00bb :\n<ul>\n<li><strong>Attention :<\/strong> La route s&rsquo;effectue \u00e0 partie de \u00ab\u00a0\/compte\/validation_modificationMail\u00a0\u00bb),<\/li>\n\n\n\n<li>Appel de la m\u00e9thode \u00ab\u00a0validation_modificationMail\u00a0\u00bb de la classe \u00ab\u00a0UtilisateurController\u00a0\u00bb,<\/li>\n\n\n\n<li><strong>Remarque :<\/strong> On n&rsquo;a pas besoin de transmettre \u00e0 la m\u00e9thode \u00ab\u00a0validation_modificationMail\u00a0\u00bb la valeur du nom de login ($login) car elle est d\u00e9j\u00e0 pr\u00e9sente dans la variable de session.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Contr\u00f4leur : Appel de la m\u00e9thode \u00ab\u00a0bdModificationMailUser\u00a0\u00bb de la classe \u00ab\u00a0UtilisateurManager\u00a0\u00bb pour appliquer la modification de l&rsquo;adresse mail dans la base de donn\u00e9es.<\/li>\n\n\n\n<li>Mod\u00e8le : Modification de l&rsquo;adresse mail dans la base de donn\u00e9es.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">switch($url[1]){\n    case &quot;profil&quot;: $utilisateurController-&gt;profil();\n        break;\n    case &quot;deconnexion&quot;: $utilisateurController-&gt;deconnexion();\n        break;\n    case &quot;validation_modificationMail&quot;: \n        \/\/ Remarque : On n'a pas besoin de transmettre \u00e0 la m\u00e9thode &quot;validation_modificationMail&quot; \n        \/\/ la valeur du nom de login ($login) car elle est d\u00e9j\u00e0 pr\u00e9sente dans la variable de session.                   \n        $utilisateurController-&gt;validation_modificationMail(Securite::secureHTML($_POST['mail']));\n        break;    \n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validation_modificationMail($mail){\n    if($this-&gt;utilisateurManager-&gt;bdModificationMailUser($_SESSION['profil']['login'], $mail)){\n        Toolbox::ajouterMessageAlerte(&quot;La modification a \u00e9t\u00e9 effectu\u00e9e.&quot;,Toolbox::COULEUR_VERTE);\n    } else {\n        Toolbox::ajouterMessageAlerte(&quot;Aucune modification effectu\u00e9e !&quot;,Toolbox::COULEUR_ROUGE);\n    }\n\n    header(&quot;Location: &quot;.URL.&quot;compte\/profil&quot;);\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function bdModificationMailUser($login, $mail){\n    $req= 'UPDATE utilisateur set mail = :mail WHERE login = :login';\n    $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n    $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:mail&quot;, $mail, PDO::PARAM_STR);\n    $stmt-&gt;execute();\n    $estModifier = ($stmt-&gt;rowCount() &gt; 0);\n    $stmt-&gt;closeCursor();\n    return $estModifier;\n}<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-22.png\" alt=\"\" class=\"wp-image-2490\" width=\"518\" height=\"82\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-22.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-22-300x48.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-22-768x122.png 768w\" sizes=\"(max-width: 518px) 100vw, 518px\" \/><\/figure>\n\n\n\n<p>Remarque : Si l&rsquo;on demande la modification de l&rsquo;adresse mail et que l&rsquo;on valide la modification sans avoir apport\u00e9 de modification \u00e0 son encontre, le message \u00ab\u00a0Aucune modification effectu\u00e9e !\u00a0\u00bb s&rsquo;affiche. Ceci est normal : il n&rsquo;\u00e9tait pas n\u00e9cessaire de modifier la base de donn\u00e9es car aucune modification n&rsquo;\u00e9tait \u00e0 apporter. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"142\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-23.png\" alt=\"\" class=\"wp-image-2491\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-23.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-23-300x47.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-23-768x121.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">16. Modification du mot de passe<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-bd14af\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">16. Modification du mot de passe<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va ajouter dans la vue du profil utilisateur un bouton pour demander la modification du mot de passe.  <\/p>\n\n\n\n<p>La m\u00e9thode est la suivante :<\/p>\n\n\n\n<ul>\n<li>Ajouter le bouton dans la vue du profil (profil.view.php)<\/li>\n\n\n\n<li>Routeur : Prise en compte de la route \u00ab\u00a0compte\/modificationPassword\u00a0\u00bb et appel de la m\u00e9thode \u00ab\u00a0modificationPassword\u00a0\u00bb du contr\u00f4leur (classe \u00ab\u00a0UtilisateurController\u00a0\u00bb).<\/li>\n\n\n\n<li>Contr\u00f4leur : Initier la cr\u00e9ation d&rsquo;une nouvelle vue (\u00ab\u00a0view\/utilisateur\/modificationPassword.view.php\u00a0\u00bb) en initialisant le tableau \u00ab\u00a0$data_page\u00a0\u00bb, puis appel de la m\u00e9thode \u00ab\u00a0genere_page ($data_page\u00a0\u00bb)\u00a0\u00bb.<\/li>\n\n\n\n<li>cr\u00e9ation de la vue \u00ab\u00a0view\/utilisateur\/modificationPassword.view.php\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;profil.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;div&gt;\n    &lt;a href=&quot;&lt;?=URL ?&gt;compte\/modificationPassword&quot; class=&quot;btn btn-warning&quot;&gt;Changer le mot de passe&lt;\/a&gt;\n&lt;\/div&gt;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">switch($url[1]){\n    case &quot;profil&quot;: $utilisateurController-&gt;profil();\n        break;\n    case &quot;deconnexion&quot;: $utilisateurController-&gt;deconnexion();\n        break;\n    case &quot;validation_modificationMail&quot;:\n        \/\/ Remarque : On n'a pas besoin de transmettre \u00e0 la m\u00e9thode &quot;validation_modificationMail&quot; \n        \/\/ la valeur du nom de login ($login) car elle est d\u00e9j\u00e0 pr\u00e9sente dans la variable de session.\n        $utilisateurController-&gt;validation_modificationMail(Securite::secureHTML($_POST['mail']));\n        break;\n    case &quot;modificationPassword&quot; : $utilisateurController-&gt;modificationPassword();\n        break;    \n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function modificationPassword(){\n    $data_page = [\n        &quot;page_description&quot; =&gt; &quot;Modification du mot de passe&quot;,\n        &quot;page_title&quot; =&gt; &quot;Modification du mot de passe&quot;,\n        &quot;view&quot; =&gt; &quot;views\/Utilisateur\/modificationPassword.view.php&quot;,\n        &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n    ];\n    $this-&gt;genererPage($data_page);\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;view\/utilisateur\/modificationPassword.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;h1&gt;&lt;?= $_SESSION['profil']['login'] ?&gt; - Modification du mot de passe &lt;\/h1&gt;\n&lt;form method=&quot;POST&quot; action=&quot;&lt;?= URL ?&gt;compte\/validation_modificationPassword&quot;&gt;\n&lt;div class=&quot;mb-3&quot;&gt;\n        &lt;label for=&quot;ancienPassword&quot; class=&quot;form-label&quot;&gt;Ancien mot de passe&lt;\/label&gt;\n        &lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;ancienPassword&quot; id=&quot;ancienPassword&quot;&gt;\n    &lt;\/div&gt;\n    &lt;div class=&quot;mb-3&quot;&gt;\n        &lt;label for=&quot;nouveauPassword&quot; class=&quot;form-label&quot;&gt;Nouveau mot de passe&lt;\/label&gt;\n        &lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;nouveauPassword&quot;&gt;\n    &lt;\/div&gt;\n    &lt;div class=&quot;mb-3&quot;&gt;\n        &lt;label for=&quot;confirmNouveauPassword&quot; class=&quot;form-label&quot;&gt;Confirmer le mot de passe&lt;\/label&gt;\n        &lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;confirmNouveauPassword&quot;&gt;\n    &lt;\/div&gt;\n    &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot; id=&quot;btnValidation&quot;&gt;Modifier&lt;\/button&gt;\n&lt;\/form&gt;<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"756\" height=\"288\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-24.png\" alt=\"\" class=\"wp-image-2495\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-24.png 756w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-24-300x114.png 300w\" sizes=\"(max-width: 756px) 100vw, 756px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">17. Ajout d&rsquo;un code de v\u00e9rification en JavaScript<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-7d560f\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">17. Ajout d&rsquo;un code de v\u00e9rification en JavaScript<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va ajouter du code de v\u00e9rification en JavaScript dans la vue \u00ab\u00a0modificationPassword.view.php\u00a0\u00bb pour contr\u00f4ler que le nouveau mot de passe qui aura \u00e9t\u00e9 saisi et sa confirmation sont bien identiques. Si se n&rsquo;est pas le cas, le bouton \u00ab\u00a0Valider\u00a0\u00bb sera inactif (couleur gris\u00e9e) et un message sera affich\u00e9 pour en expliquer la cause.<\/p>\n\n\n\n<p>La m\u00e9thode est la suivante :<\/p>\n\n\n\n<ul>\n<li>Contr\u00f4leur : Pour ajouter du code JavaScript dans la vue \u00ab\u00a0modificationPassword.view.php\u00a0\u00bb on modifie la m\u00e9thode \u00ab\u00a0modificationPassword\u00a0\u00bb en ajoutant le fichier JavaScript dans la structure du tableau \u00ab\u00a0$data_page\u00a0\u00bb<\/li>\n\n\n\n<li>Vue \u00ab\u00a0modificationPassword.view.php\u00a0\u00bb : On modifie le code html pour :\n<ul>\n<li>Inactiv\u00e9 par d\u00e9faut le bouton de validation (id : \u00ab\u00a0btnValidation\u00a0\u00bb),<\/li>\n\n\n\n<li>Le champ \u00ab\u00a0Nouveau mot de passe\u00a0\u00bb aura d&rsquo;id : \u00ab\u00a0nouveauPassword,<\/li>\n\n\n\n<li>Le champ \u00ab\u00a0Confirmer le mot de passe\u00a0\u00bb aura d&rsquo;id : \u00ab\u00a0confirmNouveauPassword,<\/li>\n\n\n\n<li>Ajouter un message qui s&rsquo;affichera en cas d&rsquo;erreur (inactiv\u00e9 par d\u00e9faut). On ajoutera une balise &lt;div&gt; avec pour id : \u00ab\u00a0erreur\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>On cr\u00e9er le fichier \u00ab\u00a0public\/Javascript\/modificationPassword.js\u00a0\u00bb et construire le code permettant de v\u00e9rifier l&rsquo;\u00e9quivalence du nouveau mot de passe avec sa confirmation. En cas de diff\u00e9rence on :\n<ul>\n<li>Inactivera le bouton de validation et,<\/li>\n\n\n\n<li>affichera un message d&rsquo;erreur expliquafif.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function modificationPassword(){\n    $data_page = [\n        &quot;page_description&quot; =&gt; &quot;Modification du mot de passe&quot;,\n        &quot;page_title&quot; =&gt; &quot;Modification du mot de passe&quot;,\n        &quot;page_javascript&quot; =&gt; ['modificationPassword.js'],\n        &quot;view&quot; =&gt; &quot;views\/Utilisateur\/modificationPassword.view.php&quot;,\n        &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n    ];\n    $this-&gt;genererPage($data_page);\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;view\/utilisateur\/modificationPassword.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;h1&gt;&lt;?= $_SESSION['profil']['login'] ?&gt; - Modification du mot de passe &lt;\/h1&gt;\n&lt;form method=&quot;POST&quot; action=&quot;&lt;?= URL ?&gt;compte\/validation_modificationPassword&quot;&gt;\n&lt;div class=&quot;mb-3&quot;&gt;\n        &lt;label for=&quot;ancienPassword&quot; class=&quot;form-label&quot;&gt;Ancien mot de passe&lt;\/label&gt;\n        &lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;ancienPassword&quot; id=&quot;ancienPassword&quot;&gt;\n    &lt;\/div&gt;\n    &lt;div class=&quot;mb-3&quot;&gt;\n        &lt;label for=&quot;nouveauPassword&quot; class=&quot;form-label&quot;&gt;Nouveau mot de passe&lt;\/label&gt;\n        &lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;nouveauPassword&quot; id=&quot;nouveauPassword&quot;&gt;\n    &lt;\/div&gt;\n    &lt;div class=&quot;mb-3&quot;&gt;\n        &lt;label for=&quot;confirmNouveauPassword&quot; class=&quot;form-label&quot;&gt;Confirmer le mot de passe&lt;\/label&gt;\n        &lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;confirmNouveauPassword&quot; name=&quot;confirmNouveauPassword&quot;&gt;\n    &lt;\/div&gt;\n    &lt;div id=&quot;erreur&quot; class=&quot;d-none alert alert-danger&quot;&gt;Les mots de passe ne correspondent pas !&lt;\/div&gt;\n    &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot; id=&quot;btnValidation&quot; disabled&gt;Modifier&lt;\/button&gt;\n&lt;\/form&gt;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;javascript&quot;,&quot;mime&quot;:&quot;text\/javascript&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;public\/Javascript\/modificationPassword.js&quot;,&quot;language&quot;:&quot;JavaScript&quot;,&quot;modeName&quot;:&quot;js&quot;}\">const nouveauPassword = document.querySelector(&quot;#nouveauPassword&quot;);\nconst confirmNouveauPassword = document.querySelector(&quot;#confirmNouveauPassword&quot;);\n\n\/\/ avec l'option &quot;change&quot; : l'\u00e9v\u00e8nement se d\u00e9clenche quand le contr\u00f4le perd le focus\nnouveauPassword.addEventListener(&quot;keyup&quot;,function(){\n    \/\/console.log(&quot;Modification du nouveau mot de passe&quot;);\n    verificationPassword();\n\n})\n\nconfirmNouveauPassword.addEventListener(&quot;keyup&quot;,function(){\n    \/\/console.log(&quot;Confirmation modification du nouveau mot de passe&quot;);\n    verificationPassword();\n})\n\nfunction verificationPassword(){\n    if(nouveauPassword.value === confirmNouveauPassword.value){\n        document.querySelector(&quot;#btnValidation&quot;).disabled = false;\n        document.querySelector(&quot;#erreur&quot;).classList.add(&quot;d-none&quot;);\n    } else {\n        document.querySelector(&quot;#btnValidation&quot;).disabled = true;\n        document.querySelector(&quot;#erreur&quot;).classList.remove(&quot;d-none&quot;);\n    }\n}<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"233\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-25.png\" alt=\"\" class=\"wp-image-2499\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-25.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-25-300x78.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-25-768x199.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">18. Validation du changement de mot de passe<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-6a6e2b\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">18. Validation du changement de mot de passe<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va maintenant g\u00e9rer la soumission de la modification du mot de passe initi\u00e9e dans l&rsquo;\u00e9tape 16. <\/p>\n\n\n\n<p>La m\u00e9thode est la suivante :<\/p>\n\n\n\n<ul>\n<li>Routeur : Prise en compte de la route \u00ab\u00a0\/compte\/validation_modificationPassword\u00a0\u00bb :\n<ul>\n<li>Si une des chaine de caract\u00e8res \u00ab\u00a0ancienPassword\u00a0\u00bb, \u00ab\u00a0nouveauPassword\u00a0\u00bb et \u00ab\u00a0confirmNouveauPassword\u00a0\u00bb est vide, on d\u00e9route vers une erreur. <\/li>\n\n\n\n<li>Appel de la m\u00e9thode \u00ab\u00a0validation_modificationPassword\u00a0\u00bb de la classe \u00ab\u00a0UtilisateurController\u00a0\u00bb,<\/li>\n\n\n\n<li><strong>Remarque :<\/strong> On n&rsquo;a pas besoin de transmettre \u00e0 la m\u00e9thode \u00ab\u00a0validation_modificationPassword\u00a0\u00bb la valeur du nom de login ($login) car elle est d\u00e9j\u00e0 pr\u00e9sente dans la variable de session.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Contr\u00f4leur : Appel de la m\u00e9thode \u00ab\u00a0bdModificationMailPassword\u00a0\u00bb de la classe \u00ab\u00a0UtilisateurManager\u00a0\u00bb pour appliquer la modification du mot de passe dans la base de donn\u00e9es.<br>Si la valeur \u00ab\u00a0ancienPassword\u00a0\u00bb est diff\u00e9rente de celle du mot de passe (d\u00e9crypt\u00e9) actuel dans la base de donn\u00e9es, on d\u00e9route vers une erreur. <\/li>\n\n\n\n<li>Mod\u00e8le : Modification du mot de passe dans la base de donn\u00e9es.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;validation_modificationPassword&quot; :\n    $ancienPassword = Securite::secureHTML($_POST['ancienPassword']);\n    $nouveauPassword = Securite::secureHTML($_POST['nouveauPassword']);\n    $confirmNouveauPassword = Securite::secureHTML($_POST['confirmNouveauPassword']);\n    if(!empty($ancienPassword) &amp;&amp; !empty($nouveauPassword) &amp;&amp; !empty($confirmNouveauPassword)){\n        $utilisateurController-&gt;validation_modificationPassword($ancienPassword, $nouveauPassword, \n                                                                $confirmNouveauPassword);\n    } else {\n        Toolbox::ajouterMessageAlerte(&quot;Vous n'avez pas renseign\u00e9 toutes les informations&quot;, \n            Toolbox::COULEUR_ROUGE);\n        header('Location: '.URL.&quot;compte\/modificationPassword&quot;);\n    }                        \nbreak;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validation_modificationPassword($ancienPassword, $nouveauPassword, $confirmNouveauPassword){\n    if($nouveauPassword === $confirmNouveauPassword){\n        if($this-&gt;utilisateurManager-&gt;isCombinaisonValide($_SESSION['profil']['login'], $ancienPassword)){\n            $passwordCrypte = password_hash($nouveauPassword, PASSWORD_DEFAULT);\n            if($this-&gt;utilisateurManager-&gt;bdModificationPassword($_SESSION['profil']['login'], $passwordCrypte)){\n                Toolbox::ajouterMessageAlerte(&quot;Le mot de passe a \u00e9t\u00e9 modifi\u00e9 avec success.&quot;,Toolbox::COULEUR_VERTE);\n                header(&quot;Location: &quot;.URL.&quot;compte\/profil&quot;);    \n            } else {\n                Toolbox::ajouterMessageAlerte(&quot;La modification du mot de passe a \u00e9chou\u00e9e !&quot;,Toolbox::COULEUR_ROUGE);\n                header(&quot;Location: &quot;.URL.&quot;compte\/modificationPassword&quot;);    \n            }\n        } else {\n            Toolbox::ajouterMessageAlerte(&quot;Le nom du mot de passe \u00e0 modifier est erron\u00e9 !&quot;,Toolbox::COULEUR_ROUGE);\n            header(&quot;Location: &quot;.URL.&quot;compte\/modificationPassword&quot;);\n        }\n    } else {\n        Toolbox::ajouterMessageAlerte(&quot;Le nouveau mot de passe ne correspond pas \u00e0 celui de sa confirmation !&quot;, \n        Toolbox::COULEUR_ROUGE);\n        header('Location: '.URL.&quot;compte\/modificationPassword&quot;);\n    }\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function bdModificationPassword($login, $password){\n    $req= 'UPDATE utilisateur set password = :password WHERE login = :login';\n    $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n    $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:password&quot;, $password, PDO::PARAM_STR);\n    $stmt-&gt;execute();\n    $estModifier = ($stmt-&gt;rowCount() &gt; 0);\n    $stmt-&gt;closeCursor();\n    return $estModifier;\n}<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"341\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-26.png\" alt=\"\" class=\"wp-image-2502\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-26.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-26-300x114.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-26-768x291.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"275\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-27.png\" alt=\"\" class=\"wp-image-2503\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-27.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-27-300x92.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-27-768x235.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">19. Suppression de compte<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-8c04ba\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">19. Suppression de compte<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va maintenant g\u00e9rer la suppression totale d&rsquo;un compte. Le bouton \u00ab\u00a0Suppression du compte\u00a0\u00bb apparait dans le profil du compte de l&rsquo;utilisateur authentifi\u00e9. Ainsi, l&rsquo;utilisateur peut uniquement supprimer son propre compte.<\/p>\n\n\n\n<p>Par mesure de pr\u00e9caussion, la demande de suppression affiche un message de confirmation poss\u00e8dant un second bouton qu&rsquo;il faudra s\u00e9lectionner pour que la suppression se fasse. <\/p>\n\n\n\n<p>La m\u00e9thode est la suivante :<\/p>\n\n\n\n<ul>\n<li>Vue : Modification de la vue de profil dans le fichier \u00ab\u00a0profil.view.php\u00a0\u00bb :\n<ul>\n<li>Affichage du bouton \u00ab\u00a0Suppression du compte\u00a0\u00bb (id : \u00ab\u00a0btnSupCompte\u00a0\u00bb) \u00e0 la droite du bouton \u00ab\u00a0Changer le mot de passe\u00a0\u00bb. La s\u00e9lection du bouton entraine l&rsquo;affichage du message inclut dans la balise &lt;div&gt; d\u00e9crite ci-dessous.<\/li>\n\n\n\n<li>Cr\u00e9ation d&rsquo;une balise &lt;div&gt; dans laquelle sont affich\u00e9s le message d&rsquo;alerte demandant la confirmation de suppression, ainsi que le bouton \u00ab\u00a0Je souhaite supprimer mon compte\u00a0\u00bb qui d\u00e9clenchera le routage vers le chemin \u00ab\u00a0compte\/suppressionCompte\u00a0\u00bb (accessible dans le fichier index.php). <\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>JavaScript : Modification du fichier \u00ab\u00a0profil.js\u00a0\u00bb pour l&rsquo;ajout de la prise en compte de l&rsquo;affichage du message et du bouton de confirmation de suppression incluts dans la balise &lt;div&gt; (suppression de l&rsquo;attribut \u00ab\u00a0d-none\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;profil.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;br \/&gt;\n&lt;div&gt;\n    &lt;a href=&quot;&lt;?=URL ?&gt;compte\/modificationPassword&quot; class=&quot;btn btn-warning&quot;&gt;Changer le mot de passe&lt;\/a&gt;\n    &amp;nbsp;\n    &lt;button id=&quot;btnSuppressionCompte&quot; class=&quot;btn btn-danger&quot;&gt;Supprimer son compte&lt;\/button&gt;\n&lt;\/div&gt;\n&lt;div id=&quot;suppressionCompte&quot; class=&quot;d-none m-2&quot;&gt;\n    &lt;div class=&quot;alert alert-danger&quot;&gt;\n        Veuillez confirmer la suppression du compte. Cela aura pour effet de supprimer le compte d\u00e9finitivement !\n        &lt;br \/&gt;\n        &lt;a href=&quot;&lt;?=URL; ?&gt;compte\/suppressionCompte&quot; class=&quot;btn btn-danger&quot;&gt;Je souhaite supprimer mon compte&lt;\/a&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;javascript&quot;,&quot;mime&quot;:&quot;text\/javascript&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;public\/Javascript\/profil.js&quot;,&quot;language&quot;:&quot;JavaScript&quot;,&quot;modeName&quot;:&quot;js&quot;}\">...\nbtnSuppressionCompte.addEventListener(&quot;click&quot;, function() {\n    document.querySelector(&quot;#suppressionCompte&quot;).classList.remove(&quot;d-none&quot;);\n})<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"300\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-28.png\" alt=\"\" class=\"wp-image-2506\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-28.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-28-300x100.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-28-768x256.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">20. Validation de la suppression de compte<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-3f6953\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">20. Validation de la suppression de compte<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va maintenant g\u00e9rer la soumission de la suppression du compte initi\u00e9e dans l&rsquo;\u00e9tape pr\u00e9c\u00e9dente. <\/p>\n\n\n\n<p>La m\u00e9thode est la suivante :<\/p>\n\n\n\n<ul>\n<li>Routeur : Prise en compte de la route \u00ab\u00a0\/compte\/suppressionCompte\u00a0\u00bb : Appel de la m\u00e9thode \u00ab\u00a0suppressionCompte\u00a0\u00bb de la classe \u00ab\u00a0UtilisateurController\u00a0\u00bb.<\/li>\n\n\n\n<li>Contr\u00f4leur : Appel de la m\u00e9thode \u00ab\u00a0bdSuppressionCompte\u00a0\u00bb de la classe \u00ab\u00a0UtilisateurManager\u00a0\u00bb pour appliquer la suppression du compte dans la base de donn\u00e9es.<br>On app\u00e8le la fonction \u00ab\u00a0deconnection()\u00a0\u00bb afin de supprimer la variable de session de profil et rediriger l&rsquo;utilisateur vers la page d&rsquo;accueil. <\/li>\n\n\n\n<li>Mod\u00e8le : Suppression du compte dans la base de donn\u00e9es.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;suppressionCompte&quot; : $utilisateurController-&gt;suppressionCompte();\nbreak;    <\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function suppressionCompte(){\n    if($this-&gt;utilisateurManager-&gt;bdSuppressionCompte($_SESSION['profil']['login'])){\n        Toolbox::ajouterMessageAlerte(&quot;La suppression de votre compte a \u00e9t\u00e9 effectu\u00e9e.&quot;,Toolbox::COULEUR_VERTE);\n        $this-&gt;deconnexion();\n    } else  {\n        Toolbox::ajouterMessageAlerte(&quot;La suppression n'a pas fonctionn\u00e9e, contactez l'administrateur !&quot;, \n        Toolbox::COULEUR_ROUGE);\n        header('Location: '.URL.&quot;compte\/profil&quot;);\n    }\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function bdSuppressionCompte($login){\n    $req= 'DELETE FROM utilisateur WHERE login = :login';\n    $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n    $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n    $stmt-&gt;execute();\n    $estSupprimer = ($stmt-&gt;rowCount() &gt; 0);\n    $stmt-&gt;closeCursor();\n    return $estSupprimer;\n}<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"301\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-29.png\" alt=\"\" class=\"wp-image-2509\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-29.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-29-300x100.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-29-768x257.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">21. Ajout d&rsquo;une image de profil<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-ed5370\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">21. Ajout d&rsquo;une image de profil<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va maintenant g\u00e9rer l&rsquo;ajout d&rsquo;une photo de profil sur le compte des utilisateurs. Lors de la cr\u00e9ation du compte, une photo de profil de base est attribu\u00e9e aux utilisateurs. Ils auront la possibilit\u00e9 ensuite de modifier ensuite leur photo de profil. Dans cette \u00e9tape, nous allons cr\u00e9er l&rsquo;ajout d&rsquo;une photo de base lors de la cr\u00e9ation d&rsquo;un compte pour un nouvel utilisateur.<\/p>\n\n\n\n<p>La m\u00e9thode est la suivante :<\/p>\n\n\n\n<ul>\n<li>Dans le dossier \u00ab\u00a0public\/Assets\/image\/\u00a0\u00bb, on cr\u00e9\u00e9 un sous-dossier \u00ab\u00a0profils\/\u00a0\u00bb et on copie le fichier de l&rsquo;image de base \u00ab\u00a0profil.png\u00a0\u00bb.<\/li>\n\n\n\n<li>Contr\u00f4leur &#8211; m\u00e9thode \u00ab\u00a0validationCreerCompte\u00a0\u00bb : On passe les informations (chemin + nom) de l&rsquo;image de base \u00e0 la m\u00e9thode \u00ab\u00a0bdCreerCompte\u00a0\u00bb <\/li>\n\n\n\n<li>Mod\u00e8le- m\u00e9thode bdCreerCompte : On g\u00e8re l&rsquo;ajout de l&rsquo;image dans la base de donn\u00e9es.<\/li>\n\n\n\n<li>Contr\u00f4leur &#8211; m\u00e9thode \u00ab\u00a0profil\u00a0\u00bb : Suppression du stockage de l&rsquo;adresse mail de l&rsquo;utilisateur car il n&rsquo;y a pas de raison de conserver le mail dans une session.<\/li>\n\n\n\n<li>Contr\u00f4leur &#8211; vue \u00ab\u00a0profil.view.php\u00a0\u00bb : On ajoutera un formulaire destin\u00e9 \u00e0 choisir un fichier image de profil utilisateur \u00e0 transf\u00e9rer dans le dossier \u00ab\u00a0public\/Assets\/image\/profils\/[$login]\/\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validation_creerCompte($login, $password, $mail){\n    if($this-&gt;utilisateurManager-&gt;verifLoginDisponible($login)){\n        $passwordCrypte = password_hash($password, PASSWORD_DEFAULT);\n        $clef = rand(0,9999);\n        if($this-&gt;utilisateurManager-&gt;bdCreerCompte($login, $passwordCrypte, $mail, $clef, &quot;profils\/profil.png&quot;)){\n            $this-&gt;sendMailValidation($login, $mail, $clef);\n        ...  <\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function bdCreerCompte($login, $passwordCrypte, $mail, $clef, $image){\n    $req= &quot;INSERT INTO utilisateur (login, password, mail, est_valide, role, clef, image)\n    VALUES (:login, :password, :mail, 0, 'utilisateur', :clef, :image)&quot;;\n    $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n    $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:password&quot;, $passwordCrypte, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:mail&quot;, $mail, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:clef&quot;, $clef, PDO::PARAM_INT);\n    $stmt-&gt;bindValue(&quot;:image&quot;, $image, PDO::PARAM_STR);\n    $stmt-&gt;execute();\n    \/\/ Si l'ajout n'a pas fonctionn\u00e9, alors on reverra estAjouter=rowCount=0=flase\n    $estAjouter = ($stmt-&gt;rowCount() &gt; 0);\n    $stmt-&gt;closeCursor();\n    return $estAjouter;\n}\n<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;view\/utilisateur\/profil.view.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;div&gt;\n    &lt;div&gt;\n        &lt;img src=&quot;&lt;?= URL; ?&gt;public\/Assets\/images\/&lt;?= $utilisateur['image'] ?&gt;&quot; width=&quot;100px&quot; alt=&quot;photo de profil&quot; \/&gt;\n    &lt;\/div&gt;\n    &lt;form method=&quot;POST&quot; action=&quot;&lt;?= URL; ?&gt;compte\/validation_ModificationImage&quot; enctype=&quot;multipart\/form-data&quot;&gt;\n        &lt;label for=&quot;image&quot;&gt;Changer l'image de profil&lt;\/label&gt;&lt;br \/&gt;\n        &lt;input type=&quot;file&quot; class=&quot;form-control-file&quot; id=&quot;image&quot; name=&quot;image&quot; onchange=&quot;submit();&quot; \/&gt;\n    &lt;\/form&gt;\n&lt;\/div&gt;\n&lt;br \/&gt;<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"474\" height=\"424\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-30.png\" alt=\"\" class=\"wp-image-2518\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-30.png 474w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-30-300x268.png 300w\" sizes=\"(max-width: 474px) 100vw, 474px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">22. Modification de l&rsquo;image de profil<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-e70c29\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">22. Modification de l&rsquo;image de profil<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va mettre en oeuvre la modification l&rsquo;image de profil de l&rsquo;utilisateur \u00e0 par du bouton \u00ab\u00a0Parcourir\u00a0\u00bb avec lequel l&rsquo;utilisateur pourra s\u00e9lectionner sa propre image de profil. La taille de l&rsquo;image de profil par d\u00e9faut est de 534*720 pixels.<\/p>\n\n\n\n<p>La m\u00e9thode est la suivante :<\/p>\n\n\n\n<ul>\n<li>Dans router : On ajoute la route \u00ab\u00a0validation_modificationImage\u00a0\u00bb. Si l&rsquo;image s\u00e9lectionn\u00e9e n&rsquo;est pas vide, on app\u00e8le la m\u00e9thode \u00ab\u00a0validation_modificationImage\u00a0\u00bb du contr\u00f4leur.<\/li>\n\n\n\n<li>Contr\u00f4leur &#8211; m\u00e9thode \u00ab\u00a0validation_modificationImage\u00a0\u00bb : \n<ul>\n<li>On cr\u00e9\u00e9 le sous-dossier portant le nom du \u00ab\u00a0$login\u00a0\u00bb \u00e0 partir du dossier \u00ab\u00a0\/public\/Assets\/image\/profils\/\u00a0\u00bb, puis on copie l&rsquo;image s\u00e9lectionn\u00e9e par l&rsquo;utilisateur \u00e0 l&rsquo;int\u00e9rieur.<\/li>\n\n\n\n<li>Pour cela, on fera appel \u00e0 la m\u00e9thode \u00ab\u00a0ajoutImage\u00a0\u00bb de la classe \u00ab\u00a0Toolbox\u00a0\u00bb.<\/li>\n\n\n\n<li>Avant de mettre \u00e0 jour la base de donn\u00e9es avec le nom de l&rsquo;image de profil s\u00e9lectionn\u00e9, on interroge la base de donn\u00e9es (m\u00e9thode \u00ab\u00a0getImageUtilisateur\u00a0\u00bb du mod\u00e8le) pour savoir si l&rsquo;utilisateur avait d\u00e9j\u00e0 choisi une image (autre que celle par d\u00e9faut). Si c&rsquo;est le cas, on supprime l&rsquo;ancienne image du dossier \/profils\/[$login]\/. <\/li>\n\n\n\n<li>Ensuite, on app\u00e8le le m\u00e9thode \u00ab\u00a0bdAjoutImage\u00a0\u00bb de la classe mod\u00e8le \u00ab\u00a0UtilisateurManager\u00a0\u00bb pour enregistrer le nom de l&rsquo;image pr\u00e9sente dans le dossier \u00ab\u00a0\/profils\/[$login]\/\u00a0\u00bb.<\/li>\n\n\n\n<li>Enfin, on redirige le lien vers le profil utilisateur : route \u00ab\u00a0compte\/profil\u00a0\u00bb.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Classe \u00ab\u00a0Toolbox\u00a0\u00bb- m\u00e9thode ajoutImage : On g\u00e8re la copie d&rsquo;un fichier dans un dossier dont le chemin est pass\u00e9 en param\u00e8tre.<\/li>\n\n\n\n<li>Mod\u00e8le &#8211; m\u00e9thode \u00ab\u00a0bdAjoutImage\u00a0\u00bb : On met \u00e0 jour le champ \u00ab\u00a0image\u00a0\u00bb dans la base de donn\u00e9e pour l&rsquo;utilisateur connect\u00e9.<\/li>\n\n\n\n<li>Mod\u00e8le &#8211; m\u00e9thode \u00ab\u00a0getImageUtilisateur\u00a0\u00bb : Requ\u00eate sur la table \u00ab\u00a0utilisateur\u00a0\u00bb pour obtenir la valeur du champ \u00ab\u00a0image\u00a0\u00bb de l&rsquo;utilisateur connect\u00e9.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">case &quot;validation_ModificationImage&quot; :\n    \/\/si l'on veut visualiser le contenu du tableau &quot;$_FILES['image']&quot; : print_r($_FILES['image']);\n    \/\/ Si une image a \u00e9t\u00e9 post\u00e9 alors sa taille doit \u00eatre &gt; \u00e0 0\n    if($_FILES['image']['size'] &gt; 0) {\n        $utilisateurController-&gt;validation_modificationImage($_FILES['image']);\n    } else {\n        Toolbox::ajouterMessageAlerte(&quot;Vous n'avez pas modifi\u00e9 l'image&quot;, Toolbox::COULEUR_ROUGE);\n        header(&quot;Location: &quot;.URL.&quot;compte\/profil&quot;);\n    }\nbreak;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validation_modificationImage($file){\n    try{\n        \/\/ Chaque utilisateur va avoir un r\u00e9pertoire personnel (nom login) \u00e0 partir du dossier &quot;profil&quot;\n        $repertoire = &quot;public\/Assets\/images\/profils\/&quot;.$_SESSION['profil']['login'].&quot;\/&quot;;\n        \/\/ajout de l'image r\u00e9cup\u00e9r\u00e9e pr\u00e9c\u00e9demment (profil.view.php) dans le rep perso de l'utilisateur\n        $nomImage = Toolbox::ajoutImage($file,$repertoire);\n        \/\/Supression de l'ancienne image du r\u00e9pertoire (nettoyage)\n        $this-&gt;dossierSuppressionImageUtilisateur($_SESSION['profil']['login']);\n        \/\/Ajout de la nouvelle image dans la BD\n        $nomImageBD = &quot;profils\/&quot;.$_SESSION['profil']['login'].&quot;\/&quot;.$nomImage;\n        if($this-&gt;utilisateurManager-&gt;bdAjoutImage($_SESSION['profil']['login'],$nomImageBD)){\n            Toolbox::ajouterMessageAlerte(&quot;La modification de l'image est effectu\u00e9e&quot;, Toolbox::COULEUR_VERTE);\n        } else {\n            Toolbox::ajouterMessageAlerte(&quot;La modification de l'image n'a pas \u00e9t\u00e9 effectu\u00e9e&quot;, Toolbox::COULEUR_ROUGE);\n        }\n      \/\/ Utilisation du syst\u00e8me d'alerte pour afficher un message d'erreur li\u00e9 \u00e0 l'upload de l'image \n      \/\/ (exemple : image trop grosse)\n    } catch(Exception $e){\n        Toolbox::ajouterMessageAlerte($e-&gt;getMessage(), Toolbox::COULEUR_ROUGE);\n    }\n    \n    header(&quot;Location: &quot;.URL.&quot;compte\/profil&quot;);\n}\n\nprivate function dossierSuppressionImageUtilisateur($login){\n    \/\/Supression de l'ancienne image du r\u00e9pertoire (nettoyage)\n    $ancienneImage = $this-&gt;utilisateurManager-&gt;getImageUtilisateur($login);\n    if($ancienneImage !== &quot;profils\/profil.png&quot;){\n        unlink(&quot;public\/Assets\/images\/&quot;.$ancienneImage);\n    }        \n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;controllers\/Toolbox.class.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">\/\/ La fonction copie un fichier ($file) dans un r\u00e9pertoire ($dir)\npublic static function ajoutImage($file, $dir){\n    if(!isset($file['name']) || empty($file['name']))\n        throw new Exception(&quot;Vous devez indiquer une image&quot;);\n\n    \/\/ si le r\u00e9pertoire n'existe pas, on le cr\u00e9\u00e9\n    if(!file_exists($dir)) mkdir($dir,0777);\n\n    \/\/ on isole l'extension de l'image\n    $extension = strtolower(pathinfo($file['name'],PATHINFO_EXTENSION));\n    \/\/ nombre al\u00e9atoire pour donner un nom \u00e0 l'image copi\u00e9e\n    $random = rand(0,99999);\n    $target_file = $dir.$random.&quot;_&quot;.$file['name'];\n    \n    if(!getimagesize($file[&quot;tmp_name&quot;]))\n        throw new Exception(&quot;Le fichier n'est pas une image&quot;);\n    if($extension !== &quot;jpg&quot; &amp;&amp; $extension !== &quot;jpeg&quot; &amp;&amp; $extension !== &quot;png&quot; &amp;&amp; $extension !== &quot;gif&quot;)\n        throw new Exception(&quot;L'extension du fichier n'est pas reconnu&quot;);\n    if(file_exists($target_file))\n        throw new Exception(&quot;Le fichier existe d\u00e9j\u00e0&quot;);\n    if($file['size'] &gt; 500000)\n        throw new Exception(&quot;Le fichier est trop gros&quot;);\n    \/\/ Apr\u00e8s les tets, si l'image est \u00e9ligible, elle est copi\u00e9e dans le dossier ad\u00e9quat\n    if(!move_uploaded_file($file['tmp_name'], $target_file))\n        throw new Exception(&quot;l'ajout de l'image n'a pas fonctionn\u00e9&quot;);\n    else return ($random.&quot;_&quot;.$file['name']);\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function bdAjoutImage($login,$image){\n    $req = &quot;UPDATE utilisateur set image = :image WHERE login = :login&quot;;\n    $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n    $stmt-&gt;bindValue(&quot;:login&quot;,$login,PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:image&quot;,$image,PDO::PARAM_STR);\n    $stmt-&gt;execute();\n    $estModifier = ($stmt-&gt;rowCount() &gt; 0);\n    $stmt-&gt;closeCursor();\n    return $estModifier;\n}\n\npublic function getImageUtilisateur($login){\n    $req = &quot;SELECT image FROM utilisateur WHERE login = :login&quot;;\n    $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n    $stmt-&gt;bindValue(&quot;:login&quot;,$login,PDO::PARAM_STR);\n    $stmt-&gt;execute();\n    $resultat = $stmt-&gt;fetch(PDO::FETCH_ASSOC);\n    $stmt-&gt;closeCursor();\n    return $resultat['image'];\n}<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1000\" height=\"312\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-31.png\" alt=\"\" class=\"wp-image-2526\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-31.png 1000w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-31-300x94.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-31-768x240.png 768w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">23. Suppression de l&rsquo;image lors de la suppression du compte<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-e29b75\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">23. Suppression de l&rsquo;image lors de la suppression du compte<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Lors de la suppression du compte, on doit \u00e9galement supprimer l&rsquo;image \u00e9ventuelle stock\u00e9e dans le dossier \u00ab\u00a0\/profils\/[$login\u00a0\u00bb], puis supprimer le dossier \u00ab\u00a0\/[$login]\u00a0\u00bb lui-m\u00eame. <\/p>\n\n\n\n<p>On effectuera ces op\u00e9rations dans la m\u00e9thode \u00ab\u00a0suppressionCompte\u00a0\u00bb dans le contr\u00f4leur.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function suppressionCompte(){\n    $this-&gt;dossierSuppressionImageUtilisateur($_SESSION['profil']['login']);\n    rmdir(&quot;public\/Assets\/images\/profil\/&quot;.$_SESSION['profil']['login']);\n    if($this-&gt;utilisateurManager-&gt;bdSuppressionCompte($_SESSION['profil']['login'])){\n        Toolbox::ajouterMessageAlerte(&quot;La suppression de votre compte a \u00e9t\u00e9 effectu\u00e9e.&quot;,Toolbox::COULEUR_VERTE);\n        $this-&gt;deconnexion();\n    } else  {\n        Toolbox::ajouterMessageAlerte(&quot;La suppression n'a pas fonctionn\u00e9e, contactez l'administrateur !&quot;, \n        Toolbox::COULEUR_ROUGE);\n        header('Location: '.URL.&quot;compte\/profil&quot;);\n    }\n}<\/pre><\/div>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">24. Partie administrateur &#8211; 1<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-1cbbeb\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">24. Partie administrateur &#8211; 1<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va maintenant prendre en compte le r\u00f4le administrateur. Pour cela, dans un premier temps, on va r\u00e9aliser les actions suivantes :<\/p>\n\n\n\n<ul>\n<li>Prendre en charge l&rsquo;affectation du r\u00f4le et assurer sa sauvegarde dans la base de donn\u00e9es ; d&rsquo;ou des modifications \u00e0 apporter dans le mod\u00e8le.<br>Remarque : Lors de la cr\u00e9ation, le r\u00f4le attribu\u00e9 est celui d&rsquo;utilisateur.<\/li>\n\n\n\n<li>Sauvegarder le r\u00f4le dans une variable de session car il est important de connaitre le avant d&rsquo;ex\u00e9cuter des commandes dont les acc\u00e8s sont soumis \u00e0 des authorisation de droits d&rsquo;acc\u00e8s.<\/li>\n\n\n\n<li>On rajoutera \u00e0 cet effet les deux fonctions \u00ab\u00a0estUtilisateur\u00a0\u00bb et \u00ab\u00a0estAdministrateur\u00a0\u00bb dans la classe \u00ab\u00a0Securite\u00a0\u00bb<\/li>\n\n\n\n<li>Dans le menu, on ajoutera un lien suppl\u00e9mentaire pour permettre aux administrateurs d&rsquo;acc\u00e9der \u00e0 du contenu restreint. Les administrateurs auront les droits pour modifier le r\u00f4le des utilisateurs et des autres administrateurs.<\/li>\n\n\n\n<li>Le lien du menu \u00ab\u00a0G\u00e9rer les droits\u00a0\u00bb pointera sur la route \u00ab\u00a0administration\/droits\u00a0\u00bb.<\/li>\n<\/ul>\n\n\n\n<p>Actions relatives \u00e0 la base de donn\u00e9es : <\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Utilisateur.model.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">public function validation_creerCompte($login, $password, $mail){\n    if($this-&gt;utilisateurManager-&gt;verifLoginDisponible($login)){\n        $passwordCrypte = password_hash($password, PASSWORD_DEFAULT);\n        $clef = rand(0,9999);\n        if($this-&gt;utilisateurManager-&gt;bdCreerCompte($login, $passwordCrypte, $mail, $clef, &quot;profils\/profil.png&quot;, 'utilisateur')){\n\t\t...\n\t...\n}     \n      \npublic function bdCreerCompte($login, $passwordCrypte, $mail, $clef, $image, $role){\n    $req= &quot;INSERT INTO utilisateur (login, password, mail, est_valide, role, clef, image)\n    VALUES (:login, :password, :mail, 0, :role, :clef, :image)&quot;;\n    $stmt = $this-&gt;getBdd()-&gt;prepare($req);\n    $stmt-&gt;bindValue(&quot;:login&quot;, $login, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:password&quot;, $passwordCrypte, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:mail&quot;, $mail, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:clef&quot;, $clef, PDO::PARAM_INT);\n    $stmt-&gt;bindValue(&quot;:image&quot;, $image, PDO::PARAM_STR);\n    $stmt-&gt;bindValue(&quot;:role&quot;, $role, PDO::PARAM_STR);\n    $stmt-&gt;execute();\n    \/\/ Si l'ajout n'a pas fonctionn\u00e9, alors on reverra estAjouter=rowCount=0=flase\n    $estAjouter = ($stmt-&gt;rowCount() &gt; 0);\n    $stmt-&gt;closeCursor();\n    return $estAjouter;\n}<\/pre><\/div>\n\n\n\n<p>Actions relatives \u00e0 la s\u00e9curit\u00e9 : <\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Securite.class.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">class Securite{\n    public static function secureHTML($chaine){\n\t    \/\/ Permet de supprimer ou convertir en ascii les caract\u00e8res sp\u00e9ciaux\n        return htmlentities($chaine);\n    }\n    public static function isConnected(){\n        return (!empty($_SESSION['profil']));\n    }\n    public static function estUtilisateur(){\n        return ($_SESSION['profil']['role'] === &quot;utilisateur&quot;);\n    }\n    public static function estAdministrateur(){\n        return ($_SESSION['profil']['role'] === &quot;administrateur&quot;);\n    }\n}<\/pre><\/div>\n\n\n\n<p>Ajout d&rsquo;un \u00e9l\u00e9ment de menu pour l&rsquo;administrateur :<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;views\/common\/menu.php&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;?php if(Securite::isConnected() &amp;&amp; Securite::estAdministrateur()) : ?&gt;\n  &lt;li class=&quot;nav-item dropdown&quot;&gt;\n    &lt;a class=&quot;nav-link dropdown-toggle&quot; href=&quot;#&quot; id=&quot;navbarDropdown&quot; role=&quot;button&quot; data-bs-toggle=&quot;dropdown&quot; aria-expanded=&quot;false&quot;&gt;\n      Administration\n    &lt;\/a&gt;\n    &lt;ul class=&quot;dropdown-menu&quot; aria-labelledby=&quot;navbarDropdown&quot;&gt;\n      &lt;li&gt;&lt;a class=&quot;dropdown-item&quot; href=&quot;&lt;?= URL; ?&gt;administration\/droits&quot;&gt;G\u00e9rer les droits&lt;\/a&gt;&lt;\/li&gt;\n    &lt;\/ul&gt;\n  &lt;\/li&gt;\n&lt;?php endif; ?&gt;<\/pre><\/div>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">25. Partie administrateur &#8211; 2<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-4ca131\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">25. Partie administrateur &#8211; 2<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va maintenant cr\u00e9\u00e9 la page permettant \u00e0 l&rsquo;administrateur de g\u00e9rer les droits des utilisateurs, r\u00e9serv\u00e9 aux administrateur.<\/p>\n\n\n\n<p>Pour cela, on va effectuer les op\u00e9ration suivantes :<\/p>\n\n\n\n<ul>\n<li>Routeur : \n<ul>\n<li>Prise en compte de la route \u00ab\u00a0administration\/droits\u00a0\u00bb<\/li>\n\n\n\n<li>Si l&rsquo;op\u00e9rateur est bien connect\u00e9 et administrateur, appel de la m\u00e9thode \u00ab\u00a0droits\u00a0\u00bb de la classe \u00ab\u00a0AdministrateurController\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Contr\u00f4leur : \n<ul>\n<li>Dans le dossier \u00ab\u00a0controllers\/Administrateur\u00a0\u00bb on cr\u00e9\u00e9 le fichier \u00ab\u00a0Administrateur.controller.php\u00a0\u00bb<\/li>\n\n\n\n<li>On cr\u00e9\u00e9 la structure de base de la classe \u00ab\u00a0AdministrateurController\u00a0\u00bb<\/li>\n\n\n\n<li>On impl\u00e9mente la m\u00e9thode \u00ab\u00a0droits\u00a0\u00bb qui a pour but de g\u00e9n\u00e9rer la vue (fichier \u00ab\u00a0views\/Administrateur\/droits.view.php\u00a0\u00bb) en initialisant le tableau \u00ab\u00a0$data_page\u00a0\u00bb.<\/li>\n\n\n\n<li>Appel de la m\u00e9thode \u00ab\u00a0genererPage\u00a0\u00bb qui va d\u00e9clencher l&rsquo;affichage de la vue \u00ab\u00a0droits.view.php\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Vue \u00ab\u00a0droits.view.php\u00a0\u00bb :\n<ul>\n<li>Dans le dossier \u00ab\u00a0\/views\/Administrateur\/\u00a0\u00bb, cr\u00e9ation du fichier \u00ab\u00a0droits.view.php\u00a0\u00bb<\/li>\n\n\n\n<li>Cr\u00e9ation de la vue permettant \u00e0 l&rsquo;administrateur d&rsquo;acc\u00e9der \u00e0 la liste des utilisateurs<\/li>\n\n\n\n<li>Il faudra donner la possibilit\u00e9 \u00e0 l&rsquo;administrateur de modifier les droits des utilisateurs si besoin est !<br>Donc on construit un formulaire permettant de changer les droits. On en profitera pour ajouter le r\u00f4le de super utiliasteur (avec des droits interm\u00e9diaires) en plus de utilisateur et administrateur<\/li>\n\n\n\n<li>La validation du formulaire dirigera un lien vers la nouvelle route \u00ab\u00a0administration\/validation_modificationRole\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Routeur :\n<ul>\n<li>Prise en compte de la route \u00ab\u00a0administration\/validation_modificationRole\u00a0\u00bb<\/li>\n\n\n\n<li>Appel de la m\u00e9thode \u00ab\u00a0validation_modificationRole\u00a0\u00bb de la classe \u00ab\u00a0AdministrateurController\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Contr\u00f4leur :\n<ul>\n<li>On impl\u00e9mente la m\u00e9thode \u00ab\u00a0validation_modificationRole\u00a0\u00bb qui a pour but de sauvegarder la modification du r\u00f4le de l&rsquo;utilisateur d\u00e9sign\u00e9. Pour cela, on app\u00e8le la m\u00e9thode \u00ab\u00a0bdModificationRoleUtilisateur\u00a0\u00bb dans la classe \u00ab\u00a0AdministrateurManager\u00a0\u00bb du mod\u00e8le<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Mod\u00e8le :\n<ul>\n<li>Dans le dossier \u00ab\u00a0models\/Administrateur\u00a0\u00bb on cr\u00e9\u00e9 le fichier \u00ab\u00a0Administrateur.model.php\u00a0\u00bb<\/li>\n\n\n\n<li>On cr\u00e9\u00e9 la structure de base de la classe \u00ab\u00a0AdministrateurManager\u00a0\u00bb<\/li>\n\n\n\n<li>On impl\u00e9mente la m\u00e9thode \u00ab\u00a0bdModificationRoleUtilisateur\u00a0\u00bb qui a pour but de mettre \u00e0 jour le champs \u00ab\u00a0role\u00a0\u00bb de la table \u00ab\u00a0utilisateur\u00a0\u00bb (et pour l&rsquo;utilisateur sp\u00e9cifier par $login) dans la base de donn\u00e9es<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">\/\/ Inclusion de fichier principal des contr\u00f4leurs qui auront la facult\u00e9 de piloter\n\/\/ toutes les pages de contenu  du site\n...\nrequire_once(&quot;.\/controllers\/Administrateur\/Administrateur.controller.php&quot;);\n$administrateurController = new AdministrateurController();\n\n...\ncase &quot;administration&quot; :\n    if(!Securite::isConnected()){\n        Toolbox::ajouterMessageAlerte(&quot;Veuillez vous connecter !&quot;, Toolbox::COULEUR_ROUGE);\n        header(&quot;Location: &quot;.URL.&quot;login&quot;);\n    } else if(!Securite::estAdministrateur()){\n        Toolbox::ajouterMessageAlerte(&quot;Vous n'avez pas le droit d'\u00eatre l\u00e0 !&quot;, Toolbox::COULEUR_ROUGE);\n        header(&quot;Location: &quot;.URL.&quot;accueil&quot;);\n    } else {\n        switch($url[1]){\n            case &quot;droits&quot;: $administrateurController-&gt;droits();\n            \tbreak;\n            case &quot;validation_modificationRole&quot;:  $administrateurController-&gt;validation_modificationRole($_POST['login'], $_POST['role']);\n            \tbreak;\n            default : throw new Exception(&quot;La page n'existe pas&quot;);\n        }\n    }\n    break;\n...<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Administrateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;.\/controllers\/MainController.controller.php&quot;);\nrequire_once(&quot;.\/models\/Administrateur\/Administrateur.model.php&quot;);\n\nclass AdministrateurController extends MainController {\n    private $administrateurController;\n    private $administrateurManager;\n\n    public function __construct(){\n        $this-&gt;administrateurManager = new AdministrateurManager();\n    }\n\n    public function droits(){\n        $utilisateurs = $this-&gt;administrateurManager-&gt;getUtilisateurs();\n\n        $data_page = [\n            &quot;page_description&quot; =&gt; &quot;Gestion des droits des utilisateurs&quot;,\n            &quot;page_title&quot; =&gt; &quot;Gestion des droits des utilisateurs&quot;,\n            &quot;utilisateurs&quot; =&gt; $utilisateurs,\n            &quot;view&quot; =&gt; &quot;views\/Administrateur\/droits.view.php&quot;,\n            &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n        ];\n        $this-&gt;genererPage($data_page);\n    }\n\n    public function validation_modificationRole($login, $role){\n        if($this-&gt;administrateurManager-&gt;bdModificationRoleUtilisateur($login, $role)){\n            Toolbox::ajouterMessageAlerte(&quot;La modification du role de l'utilisateur a \u00e9t\u00e9 effectu\u00e9e&quot;, Toolbox::COULEUR_VERTE);\n        } else {\n            Toolbox::ajouterMessageAlerte(&quot;La modification du role de l'utilisateur n'a pas \u00e9t\u00e9 effectu\u00e9e&quot;, Toolbox::COULEUR_ROUGE);\n        }\n        header(&quot;Location: &quot;.URL.&quot;administration\/droits&quot;);\n    }\n    \n    public function pageErreur($msg){\n        parent::pageErreur($msg);\n    }\n}\n?&gt;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;h1&gt;Page de gestion des droits des utilisateurs&lt;\/h1&gt;\n&lt;table class=&quot;table&quot;&gt;\n    &lt;thead&gt;\n        &lt;tr&gt;\n            &lt;th&gt;Login&lt;\/th&gt;\n            &lt;th&gt;Valid\u00e9&lt;\/th&gt;\n            &lt;th&gt;R\u00f4le&lt;\/th&gt;\n        &lt;\/tr&gt;\n        &lt;?php foreach ($utilisateurs as $utilisateur) : ?&gt;\n            &lt;tr&gt;\n                &lt;td&gt;&lt;?= $utilisateur['login'] ?&gt;&lt;\/td&gt;\n                &lt;td&gt;&lt;?= (int)$utilisateur['est_valide'] === 0 ? &quot;non valid\u00e9&quot; : &quot;valid\u00e9&quot; ?&gt;&lt;\/td&gt;\n                &lt;td&gt;\n                    &lt;?php if($utilisateur['role'] === 'administrateur') : ?&gt;\n                        &lt;?= $utilisateur['role'] ?&gt;\n                    &lt;?php else : ?&gt;\n                        &lt;form method=&quot;POST&quot; action=&quot;&lt;?= URL ?&gt;administration\/validation_modificationRole&quot;&gt;\n                            &lt;input type=&quot;hidden&quot; name=&quot;login&quot; value=&quot;&lt;?= $utilisateur['login'] ?&gt;&quot; \/&gt;\n                            &lt;select class=&quot;form-select&quot; name=&quot;role&quot; onchange=&quot;confirm('Confirmez-vous la modification ?') ? submit() : document.location.reload()&quot;&gt;\n                                &lt;option value=&quot;utilisateur&quot; &lt;?=  $utilisateur['role'] === &quot;utilisateur&quot; ? &quot;selected&quot; : &quot;&quot; ?&gt; &gt;Utilisateur&lt;\/option&gt;\n                                &lt;option value=&quot;Sutilisateur&quot; &lt;?=  $utilisateur['role'] === &quot;Sutilisateur&quot; ? &quot;selected&quot; : &quot;&quot; ?&gt; &gt;Super utilisateur&lt;\/option&gt;\n                                &lt;option value=&quot;administrateur&quot; &lt;?=  $utilisateur['role'] === &quot;administrateur&quot; ? &quot;selected&quot; : &quot;&quot; ?&gt; &gt;Administrateur&lt;\/option&gt;\n                            &lt;\/select&gt;\n                        &lt;\/form&gt;\n                    &lt;?php endif; ?&gt;\n                &lt;\/td&gt;\n            &lt;\/tr&gt;\n        &lt;?php endforeach; ?&gt;\n    &lt;\/thead&gt;\n&lt;\/table&gt;<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"332\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-33.png\" alt=\"\" class=\"wp-image-2537\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-33.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-33-300x111.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-33-768x283.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"has-text-color wp-block-heading\" id=\"2-ii-installation-de-phpmyadmin\" style=\"color:#fffdf8;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">26. S\u00e9curisation de la session avec un cookie<\/h3>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-8dd34f\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">26. S\u00e9curisation de la session avec un cookie<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>On va maintenant cr\u00e9\u00e9 la page permettant \u00e0 l&rsquo;administrateur de g\u00e9rer les droits des utilisateurs, r\u00e9serv\u00e9 aux administrateur.<\/p>\n\n\n\n<p>Pour cela, on va effectuer les op\u00e9ration suivantes :<\/p>\n\n\n\n<ul>\n<li>Routeur : \n<ul>\n<li>Prise en compte de la route \u00ab\u00a0administration\/droits\u00a0\u00bb<\/li>\n\n\n\n<li>Si l&rsquo;op\u00e9rateur est bien connect\u00e9 et administrateur, appel de la m\u00e9thode \u00ab\u00a0droits\u00a0\u00bb de la classe \u00ab\u00a0AdministrateurController\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Contr\u00f4leur : \n<ul>\n<li>Dans le dossier \u00ab\u00a0controllers\/Administrateur\u00a0\u00bb on cr\u00e9\u00e9 le fichier \u00ab\u00a0Administrateur.controller.php\u00a0\u00bb<\/li>\n\n\n\n<li>On cr\u00e9\u00e9 la structure de base de la classe \u00ab\u00a0AdministrateurController\u00a0\u00bb<\/li>\n\n\n\n<li>On impl\u00e9mente la m\u00e9thode \u00ab\u00a0droits\u00a0\u00bb qui a pour but de g\u00e9n\u00e9rer la vue (fichier \u00ab\u00a0views\/Administrateur\/droits.view.php\u00a0\u00bb) en initialisant le tableau \u00ab\u00a0$data_page\u00a0\u00bb.<\/li>\n\n\n\n<li>Appel de la m\u00e9thode \u00ab\u00a0genererPage\u00a0\u00bb qui va d\u00e9clencher l&rsquo;affichage de la vue \u00ab\u00a0droits.view.php\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Vue \u00ab\u00a0droits.view.php\u00a0\u00bb :\n<ul>\n<li>Dans le dossier \u00ab\u00a0\/views\/Administrateur\/\u00a0\u00bb, cr\u00e9ation du fichier \u00ab\u00a0droits.view.php\u00a0\u00bb<\/li>\n\n\n\n<li>Cr\u00e9ation de la vue permettant \u00e0 l&rsquo;administrateur d&rsquo;acc\u00e9der \u00e0 la liste des utilisateurs<\/li>\n\n\n\n<li>Il faudra donner la possibilit\u00e9 \u00e0 l&rsquo;administrateur de modifier les droits des utilisateurs si besoin est !<br>Donc on construit un formulaire permettant de changer les droits. On en profitera pour ajouter le r\u00f4le de super utiliasteur (avec des droits interm\u00e9diaires) en plus de utilisateur et administrateur<\/li>\n\n\n\n<li>La validation du formulaire dirigera un lien vers la nouvelle route \u00ab\u00a0administration\/validation_modificationRole\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Routeur :\n<ul>\n<li>Prise en compte de la route \u00ab\u00a0administration\/validation_modificationRole\u00a0\u00bb<\/li>\n\n\n\n<li>Appel de la m\u00e9thode \u00ab\u00a0validation_modificationRole\u00a0\u00bb de la classe \u00ab\u00a0AdministrateurController\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Contr\u00f4leur :\n<ul>\n<li>On impl\u00e9mente la m\u00e9thode \u00ab\u00a0validation_modificationRole\u00a0\u00bb qui a pour but de sauvegarder la modification du r\u00f4le de l&rsquo;utilisateur d\u00e9sign\u00e9. Pour cela, on app\u00e8le la m\u00e9thode \u00ab\u00a0bdModificationRoleUtilisateur\u00a0\u00bb dans la classe \u00ab\u00a0AdministrateurManager\u00a0\u00bb du mod\u00e8le<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Mod\u00e8le :\n<ul>\n<li>Dans le dossier \u00ab\u00a0models\/Administrateur\u00a0\u00bb on cr\u00e9\u00e9 le fichier \u00ab\u00a0Administrateur.model.php\u00a0\u00bb<\/li>\n\n\n\n<li>On cr\u00e9\u00e9 la structure de base de la classe \u00ab\u00a0AdministrateurManager\u00a0\u00bb<\/li>\n\n\n\n<li>On impl\u00e9mente la m\u00e9thode \u00ab\u00a0bdModificationRoleUtilisateur\u00a0\u00bb qui a pour but de mettre \u00e0 jour le champs \u00ab\u00a0role\u00a0\u00bb de la table \u00ab\u00a0utilisateur\u00a0\u00bb (et pour l&rsquo;utilisateur sp\u00e9cifier par $login) dans la base de donn\u00e9es<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">\/\/ Inclusion de fichier principal des contr\u00f4leurs qui auront la facult\u00e9 de piloter\n\/\/ toutes les pages de contenu  du site\n...\nrequire_once(&quot;.\/controllers\/Administrateur\/Administrateur.controller.php&quot;);\n$administrateurController = new AdministrateurController();\n\n...\ncase &quot;administration&quot; :\n    if(!Securite::isConnected()){\n        Toolbox::ajouterMessageAlerte(&quot;Veuillez vous connecter !&quot;, Toolbox::COULEUR_ROUGE);\n        header(&quot;Location: &quot;.URL.&quot;login&quot;);\n    } else if(!Securite::estAdministrateur()){\n        Toolbox::ajouterMessageAlerte(&quot;Vous n'avez pas le droit d'\u00eatre l\u00e0 !&quot;, Toolbox::COULEUR_ROUGE);\n        header(&quot;Location: &quot;.URL.&quot;accueil&quot;);\n    } else {\n        switch($url[1]){\n            case &quot;droits&quot;: $administrateurController-&gt;droits();\n            \tbreak;\n            case &quot;validation_modificationRole&quot;:  $administrateurController-&gt;validation_modificationRole($_POST['login'], $_POST['role']);\n            \tbreak;\n            default : throw new Exception(&quot;La page n'existe pas&quot;);\n        }\n    }\n    break;\n...<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;Administrateur.controller.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;?php\nrequire_once(&quot;.\/controllers\/MainController.controller.php&quot;);\nrequire_once(&quot;.\/models\/Administrateur\/Administrateur.model.php&quot;);\n\nclass AdministrateurController extends MainController {\n    private $administrateurController;\n    private $administrateurManager;\n\n    public function __construct(){\n        $this-&gt;administrateurManager = new AdministrateurManager();\n    }\n\n    public function droits(){\n        $utilisateurs = $this-&gt;administrateurManager-&gt;getUtilisateurs();\n\n        $data_page = [\n            &quot;page_description&quot; =&gt; &quot;Gestion des droits des utilisateurs&quot;,\n            &quot;page_title&quot; =&gt; &quot;Gestion des droits des utilisateurs&quot;,\n            &quot;utilisateurs&quot; =&gt; $utilisateurs,\n            &quot;view&quot; =&gt; &quot;views\/Administrateur\/droits.view.php&quot;,\n            &quot;template&quot; =&gt; &quot;views\/common\/template.php&quot;\n        ];\n        $this-&gt;genererPage($data_page);\n    }\n\n    public function validation_modificationRole($login, $role){\n        if($this-&gt;administrateurManager-&gt;bdModificationRoleUtilisateur($login, $role)){\n            Toolbox::ajouterMessageAlerte(&quot;La modification du role de l'utilisateur a \u00e9t\u00e9 effectu\u00e9e&quot;, Toolbox::COULEUR_VERTE);\n        } else {\n            Toolbox::ajouterMessageAlerte(&quot;La modification du role de l'utilisateur n'a pas \u00e9t\u00e9 effectu\u00e9e&quot;, Toolbox::COULEUR_ROUGE);\n        }\n        header(&quot;Location: &quot;.URL.&quot;administration\/droits&quot;);\n    }\n    \n    public function pageErreur($msg){\n        parent::pageErreur($msg);\n    }\n}\n?&gt;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;php&quot;,&quot;mime&quot;:&quot;text\/x-php&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:true,&quot;fileName&quot;:&quot;index.php&quot;,&quot;language&quot;:&quot;PHP&quot;,&quot;modeName&quot;:&quot;php&quot;}\">&lt;h1&gt;Page de gestion des droits des utilisateurs&lt;\/h1&gt;\n&lt;table class=&quot;table&quot;&gt;\n    &lt;thead&gt;\n        &lt;tr&gt;\n            &lt;th&gt;Login&lt;\/th&gt;\n            &lt;th&gt;Valid\u00e9&lt;\/th&gt;\n            &lt;th&gt;R\u00f4le&lt;\/th&gt;\n        &lt;\/tr&gt;\n        &lt;?php foreach ($utilisateurs as $utilisateur) : ?&gt;\n            &lt;tr&gt;\n                &lt;td&gt;&lt;?= $utilisateur['login'] ?&gt;&lt;\/td&gt;\n                &lt;td&gt;&lt;?= (int)$utilisateur['est_valide'] === 0 ? &quot;non valid\u00e9&quot; : &quot;valid\u00e9&quot; ?&gt;&lt;\/td&gt;\n                &lt;td&gt;\n                    &lt;?php if($utilisateur['role'] === 'administrateur') : ?&gt;\n                        &lt;?= $utilisateur['role'] ?&gt;\n                    &lt;?php else : ?&gt;\n                        &lt;form method=&quot;POST&quot; action=&quot;&lt;?= URL ?&gt;administration\/validation_modificationRole&quot;&gt;\n                            &lt;input type=&quot;hidden&quot; name=&quot;login&quot; value=&quot;&lt;?= $utilisateur['login'] ?&gt;&quot; \/&gt;\n                            &lt;select class=&quot;form-select&quot; name=&quot;role&quot; onchange=&quot;confirm('Confirmez-vous la modification ?') ? submit() : document.location.reload()&quot;&gt;\n                                &lt;option value=&quot;utilisateur&quot; &lt;?=  $utilisateur['role'] === &quot;utilisateur&quot; ? &quot;selected&quot; : &quot;&quot; ?&gt; &gt;Utilisateur&lt;\/option&gt;\n                                &lt;option value=&quot;Sutilisateur&quot; &lt;?=  $utilisateur['role'] === &quot;Sutilisateur&quot; ? &quot;selected&quot; : &quot;&quot; ?&gt; &gt;Super utilisateur&lt;\/option&gt;\n                                &lt;option value=&quot;administrateur&quot; &lt;?=  $utilisateur['role'] === &quot;administrateur&quot; ? &quot;selected&quot; : &quot;&quot; ?&gt; &gt;Administrateur&lt;\/option&gt;\n                            &lt;\/select&gt;\n                        &lt;\/form&gt;\n                    &lt;?php endif; ?&gt;\n                &lt;\/td&gt;\n            &lt;\/tr&gt;\n        &lt;?php endforeach; ?&gt;\n    &lt;\/thead&gt;\n&lt;\/table&gt;<\/pre><\/div>\n\n\n\n<p>R\u00e9sultats :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"900\" height=\"332\" src=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-33.png\" alt=\"\" class=\"wp-image-2537\" srcset=\"https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-33.png 900w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-33-300x111.png 300w, https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/ss-domaine-auth-33-768x283.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow\" style=\"flex-basis:22%\">\n\n<div class=\"cleanlogin-container\">\t\t\n\n\t<form class=\"cleanlogin-form\" method=\"post\" action=\"https:\/\/www.webodesign.net\/?page_id=2385\" onsubmit=\"submit.disabled = true; return true;\">\n\t\t\t\n\t\t<fieldset>\n\n\t\t\t\t\t\t<div class=\"cleanlogin-field\">\n                <label for=\"log\">Identifiant<\/label>\n\t\t\t\t<input class=\"cleanlogin-field-username\" type=\"text\" name=\"log\" placeholder=\"Identifiant\" aria-label=\"Identifiant\">\n\t\t\t<\/div>\n\t\t\t\n\t\t\t<div class=\"cleanlogin-field\">\n                <label for=\"pwd\">Mot de passe<\/label>\n\t\t\t\t<input class=\"cleanlogin-field-password\" type=\"password\" id=\"pwd\" name=\"pwd\" placeholder=\"Mot de passe\" aria-label=\"Mot de passe\">\n                <i class=\"bi bi-eye-slash\" id=\"togglePassword\"><\/i>\n\t\t\t<\/div>\n\n\t\t\t\t\t\n\t\t\t<input type=\"hidden\" name=\"clean_login_wpnonce\" value=\"e994c14fba\">\n            \n\t\t\t\t\t<\/fieldset>\n\t\t\n\t\t<fieldset>\n\t\t\t<input class=\"cleanlogin-field\" type=\"submit\" value=\"Se connecter\" name=\"submit\">\n\t\t\t<input type=\"hidden\" name=\"action\" value=\"login\">\n\t\t\t\n\t\t\t<div class=\"cleanlogin-field cleanlogin-field-remember\">\n\t\t\t\t<input type=\"checkbox\" id=\"rememberme\" name=\"rememberme\" value=\"forever\">\n\t\t\t\t<label for=\"rememberme\">Se souvenir de moi\u00a0?<\/label>\n\t\t\t<\/div>\n\t\t<\/fieldset>\n\n\t\t\n\t\t<div class=\"cleanlogin-form-bottom\">\n\t\t\t\n            \n\t\t\t\t\t\t\t\t\t\n\t\t<\/div>\n\t\t\n\t<\/form>\n\n<\/div>\n\n<script>\nconst togglePassword = document.querySelector('#togglePassword');\nconst password = document.querySelector('#pwd');\n\ntogglePassword.addEventListener('click', function (e) {\n    const type = password.getAttribute('type') === 'password' ? 'text' : 'password';\n    password.setAttribute('type', type);\n    this.classList.toggle('bi-eye');\n});\n<\/script>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Cr\u00e9ation d&rsquo;un module d&rsquo;authentification Pr\u00e9sentation 1. Cr\u00e9ation du sous-domaine \u00ab\u00a0auth\u00a0\u00bb et installation du prototype de d\u00e9part 2. La base de donn\u00e9es 3. Le prototype de d\u00e9part 4. Cr\u00e9ation du mod\u00e8le \u00ab\u00a0Visiteur\u00a0\u00bb 5. Cr\u00e9ation de la page de login 6. Validation de la connexion 7. Page de profil 8. Deconnexion 9. S\u00e9curisation de la partie \u00ab\u00a0utilisateur\u00a0\u00bb [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"qubely_global_settings":"","qubely_interactions":"","_uag_custom_page_level_css":""},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"qubely_landscape":false,"qubely_portrait":false,"qubely_thumbnail":false},"uagb_author_info":{"display_name":"remsadmin","author_link":"https:\/\/www.webodesign.net\/?author=1"},"uagb_comment_info":0,"uagb_excerpt":"Cr\u00e9ation d&rsquo;un module d&rsquo;authentification Pr\u00e9sentation 1. Cr\u00e9ation du sous-domaine \u00ab\u00a0auth\u00a0\u00bb et installation du prototype de d\u00e9part 2. La base de donn\u00e9es 3. Le prototype de d\u00e9part 4. Cr\u00e9ation du mod\u00e8le \u00ab\u00a0Visiteur\u00a0\u00bb 5. Cr\u00e9ation de la page de login 6. Validation de la connexion 7. Page de profil 8. Deconnexion 9. S\u00e9curisation de la partie \u00ab\u00a0utilisateur\u00a0\u00bb\u2026","_links":{"self":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/pages\/2385"}],"collection":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2385"}],"version-history":[{"count":58,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/pages\/2385\/revisions"}],"predecessor-version":[{"id":2543,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/pages\/2385\/revisions\/2543"}],"wp:attachment":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}