AUTEUR : FRANCK OBERLECHNER, Ingénieur Système et Réseaux
SOMMAIRE
1. Préambule
3. Déclaration de la page de LOGON
4. Analyse des codes de retour et branchement
5. et si la sécurité en encore insuffisante
6. gestion des thèmes de couleur
7. le LOGOUT et le changement de mot de passe
A. LES EXEMPLES
1) PREAMBULE
La classe ClasseLogon.php permet de gérer facilement en une seule page toute la phase de connexion d'un utilisateur, d'envoi de mot de passe si oubli, de changement de mot de passe.
Il est a noté qu'aucun champ sensible ne transite en clair ni dans un sens ni dans l'autre. La clef de cryptage et les noms de champs changent dynamiquement à chaque appel à la page.
On peut durcir la sécurité en appelant la page dans une session SSL (HTTPS), mais les serveurs des fournisseurs d'accès proposent rarement cette option.
Les cookies de mémorisation de l'identifiant sont cryptés sur le même procédé mais avec une clef fixe.
2) INSTALLATION
Définir un répertoire "include_path" en modifiant le fichier de configuration de PHP %SYSTEMROOT%\PHP.INI sous IIS
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
include_path = "d:/wwwroot/rubappli/communs"Décompresser dans le répertoire "include_path" du serveur PHP le fichier classeLogon.php et le répertoire classeLogon (ce répertoire contient la documentation et les exemples)
On obtient l'arborescence :
.../Répertoire_Include
_classePath.php
classeLogon.php
classeLogon<dir>Editer le fichier _classePath.php et modifier la ligne DEFINE en terminant par un "/" obligatoirement, la constante INCLUDEPATH doit pointer sur le répertoire ou se situe le fichier classeForms.php et _classePath.php
// PARAMETRAGE :
DEFINE('INCLUDEPATH','/rubappli/communs/');ATTENTION pour que toutes les pages de votre site fonctionnent définir de préférence un chemin absolu ( commencant par un / et donnant le chemin complet depuis la racine du site )
C'est tout ! la classe est maintenant exploitable directement
EN OPTION : DEFINITION D'UN THEME DE COULEUR IMPLICITE POUR TOUT LE SITE
Créer un fichier _classeSkin.php dans le répertoire des inclusions
<?php
// 0: Rouge, 1:Bleu, 2:Gris, 4:Vert, 5:Orange
DEFINE('DEFAULT_SKIN', 5);?>
ce fichier est utilisé par les autres classes classeTableau, classeGrid tous les objets gérés par ces classes bénéficient du même thème de couleurs.
ATTENTION : L'INSTALLATION COMPLETE EST NECESSAIRE POUR TESTER LES EXEMPLES QUI SUIVENT
3) DECLARATION D'UN LOGON
Comme pour le gestionnaire de formulaire, la déclaration d'une page ré-entrante permet de gérer tous les cas de figure de la phase de connexion :
Le mécanisme de logon et de pages protégées s'appui sur les sessions. Chacun peut ensuite gérer les variables de sessions qu'il a besoin pour gérer finement :
- Des niveaux de privilèges variable par application
- Des droits accès pour 1 ou plusieurs applications
Syntaxe :
On codera 2 sections distinctes :
- En tout début de page AVANT TOUT ORDRE HTML, une section PHP gère l'aiguillage de la réentrance et la définition des options de LOGON
- Dans le corps de la page HTML <BODY>, l'appel à l'ordre d'affichage de la fenètre de LOGON
Détail des paramètres:
- cookieprefix : c'est le préfixe des cookies de mémorisation de l'identifiant et du mot de passe dans le cas ou l'on choisit de mémoriser l'identifiant ou pour la connexion automatique [OPTIONNEL]
- urlyes : C'est le nom de la page qui sera connectée si l'autentification réussit
- urlno : Celui de la page quand la connexion est refusée
- title : titre de la page de connexion [OPTIONNEL]
- userlabel : label qui est au dessus du champ identifiant [OPTIONNEL], par défaut c'est l'adresse EMAIL qui est prise comme identifiant
- forget : possibilité d'envoyer au demandeur qui ne s'en souvient pas, son mot de passe par EMAIL [OPTIONNEL]
- change : possibilité offerte à l'utilisateur de changer son mot de passe. [OPTIONNEL]
Par soucis de sécurité on positionnera sa valeur :
- à false si on ne veut pas de cette option
- ou bien à !$_SESSION['JESUISCONNECTE'] comme celà on ne peut modifier son mot de passe que quand on est connecté. Logique !
- pwdmini : taille minumum exigée pour un mot de passe valide [OPTIONNEL] par défaut =6
- maxretry : nombre de d'essais autorisés [OPTIONNEL] par défaut =3
- username : pré-remplir le champ identifiant [OPTIONNEL] vide par défaut
- memorymode : mode de mémorisation proposé par défaut (0 : rien de sauvegardé, 1 : uniquement le nom de connexion, 2 : connexion automatique )
- timeout : temporisation en secondes qui permet de revenir à la page urlno si rien n' a été saisi. Elle est désarmée dès qu'un mot de passe est saisi ou que les images sont survolées.
- logonname_is_email : si true, alors le champ est controlé avant validation de la saisie comme étant au format email xxxxxxxx@yyyyyyyyyy.com
- checkbox : permet de simplifier le dialogue en remplacant la liste des 3 choix par une simple case à cocher "garder la session active"
ECRAN POUR SE CONNECTER
avec l'option "checkbox" activée
ECRAN POUR CHANGER DE MOT DE PASSE
Paramètres spécifiques à la gestion internationale:
- language : c'est le code ISO de la langue par défaut 'fr', 'en'... [OPTIONNEL] par défaut = 'fr'
- language_only : C'est la liste des langues autorisée parmi la liste des langues définies exemple : 'fr,en,de' [OPTIONNEL] par défaut = aucune restriction
- language_flag : si true alors les drapeaux des pays sont affichés sinon, c'est la liste des langues
- language_cookie : c'est le nom du Cookie qui va mémoriser la langue choisie par l'utilisateur, il est placé à la racine du site et il est donc disponible pour toutes les pages du site si nécessaire. [OPTIONNEL]
- international : c'est la possibilité de changer de langue à la bannière de connexion et au 1er essai, les écrans suivants utilisent ce choix sans pouvoir le modifier. [OPTIONNEL] par défaut = false, c'est le paramètre 'language' et lui seul qui est utilisé
Listes des langues utilisées :
dk: 'Dansk',
de: 'Deutsch',
en: 'English',
fr: 'Français',
it: 'Italiano',
nl: 'Nederlands',
no: 'Norsk',
pt: 'Portugês',
sp: 'Español',
fi: 'Suomi',
se: 'Svenska'pour ajouter d'autres langues : modifier le fichier classeLogon-lang.js, en prenant le code ISO international puis en copiant une langue et en traduisant tous les messages.
Ne pas oublier de copier dans img un gif 16*16 du drapeau.Tous les drapeaux du monde sont disponibles dans l'archive Flags_of_the_World.rar qui contient une librairie d'icone, extraire le bon drapeau avec un logiciel du genre AXIALIS IconWorkshop
4) ANALYSE DES CODES RETOUR ET BRANCHEMENT
Comme pour le gestionnaire de formulaire, la déclaration d'une page ré-entrante
Analyse du code retour par la fonction logon_test()
- "V" La paire IDENTIFIANT / MOT DE PASSE est validée
- "F" L'adresse de messagerie est saisie et validée on envoi un courriel
- "C" Le nouveau mot de passe vient d'être validé
$L->logon_new( array( ... ) );
$stat = $L->logon_test();
switch ($stat) {
case 'V':// C'EST ICI QUE L'ON COMPARE LA VALEUR DE CHAMPS
// SAISIS AVEC CEUX DE LA BASE, LE TEST REALISE
// ICI EST LA SIMILITUDE AVEC LA PAIRE TOTO / TATA
if (strtoupper($L->logon_get_username())=="TOTO" && strtoupper($L->logon_get_password())=="TATA") {
$_SESSION['SAMPLE_CONNECTE'] = true;
$L->logon_logon();
exit;
}
break;case 'F':
// C'EST ICI QUE L'ON VERIFIE QUE L'ADRESSE EMAIL
// CORRESPOND A UN COMPTE PRECIS
// SINON ON ENVOIE LE MESSAGE SPECIFIQUEif (strtoupper($L->logon_get_username())=="TOTO") {
$L->logon_message_password_send(true);
} else {
$L->logon_message_password_send(false,'Message spécifique, aucun utilisateur ne possède cette adresse');
}
break;case 'C':
// ---------------------------------------
// ENREGISTRER ICI LE NOUVEAU MOT DE PASSE
// LE CONTROLE SUR LA TAILLE MINIMUM A
// DEJA ETE FAIT EN JAVASCRIPT (COTE CLIENT)
// C'EST ICI QUE L'ON PEUT VERIFIER SI LE
// MOT DE PASSE N'EST PAS TOUT ALPHA OU
// TOUT NUMERIQUE
// ---------------------------------------
$L->logon_message_password_changed(true);
break;default:
}?>
DETAIL DES METHODES DISPONIBLES :
- $L->logon_get_username() retourne le champ de saisie identifiant/adresse mail
- $L->logon_get_password() retourne le champ mot de passe saisi
- $L->logon_logon() branchement direct à l'url définie en urlyes
ATTENTION on peut suite a traitement brancher une autre url en forçant $L->logon_logon('NouvelleUsr.php')
- $L->logon_message_password_send(true); informe que le message est bien parti
- $L->logon_message_password_send(false,'message spécifique'); affiche le message comme quoi le message n'est pas parti avec en option un message complémentaire
- $L->logon_message_password_changed(true); affiche le message "bien enregistré"
LA GESTION DE LA CASE OU NON ?
classeLogon ne gère pas elle même cette option c'est au moment du l'analyse des valeurs en retour que l'on programmera la prise en compte ou non :
les méthodes : $L->logon_get_username() et $L->logon_get_password() retournent strictement ce qui a été saisi. si on ne veut pas gérer la différence MAJUSCULES/Minuscules sur l'identifiant il suffira de comparer comme suit :
strtoupper($L->logon_get_username()) == strtoupper($valeur_lue_base)
pareil pour les mot de passe
5) ET SI LA SECURITE EST ENCORE INSUFFISANTE...
Il reste encore la possibilité de crypter le mot de passe dans la table des utilisateurs.
La méthode la plus simple est la fonction MD5('chaine_a_crypter') qui hache le mot de passe.
Il faut donc mémoriser dans la base cette chaine transformée et la comparer ultérieurement à MD5($L->logon_get_password())
6) LA GESTION DU THEME DE COULEUR
Comme pour toutes les classes de la gamme "classePHP" la gestion des couleurs est hiérarchisée comme suit par ordre de priorité décroissante :
- l'ordre logon_skin() explicite placé entre logon_new() et logon_output_body();
- la variable de session : $_SESSION['DEFAULT_SKIN']
- la constante 'DEFAULT_SKIN'
- la valeur par défaut de la classe
7) LES ORDRES SUPPLEMENTAIRES
On notera la page de logon : page_logon.php
7.1 Le LOGOUTPour effectuer un LOGOUT appeler la page qui gère les connexions avec l'option page_logon.php?LOGOUT le branchement à urlno est fait automatiquement.
Dans la page branchée, Il ne faut pas oublier d'effacer toutes les variables de session qui n'ont plus de raison d'être par la fonction unset()7.2) Le changement de mot de passe
Pour effectuer un changement de mot de passe utiliser l'option page_logon.php?CHANGE
ATTENTION c'est une grave faille de sécurité si vous ne positionnez pas le paramètre "change" à la valeur de $_SESSION['JE_SUIS_CONNECTE'] qui doit être un booléen
7.3) Effacer toutes traces locales ou simplement annuler le mode connexion automatiquePour effacer les cookies de mémorisation locale de l'identifiant et du mot de passe utiliser page_logon.php?INIT
2 modes donc :
- page_logon.php?INIT ou page_logon.php?INIT=0, effacer toutes les traces locales
- page_logon.php?INIT=1, effacer seulement le mode de connexion automatique
7.4) Forcer le nom de l'utilisateur et la saisie du mot de passe même si une connexion automatique a été définie et est valide
Appeler la page avec un nom d'utilisateur "TITI" pré-rempli en donnant l' argument page_logon.php?USER=TITI
A) LES EXEMPLES
sample_01.php Connexion simple sample_02.php Connexion toutes options sample_03.php timeout et mode de mémorisation par défaut sample_04.php version internationale