On dispose de toutes les informations nécessaires pour insérer une ligne dans SessionWeb identifiant, e-mail, nom et prénom, la seule subtilité étant la spécification de la durée de vali
Trang 1$ i n t e r n a u t e = $ t h i s−>bd−>o b j e t S u i v a n t ( $ r e s ) ;
/ / L ’ i n t e r n a u t e e x i s t e −t− i l ?
i f ( i s _ o b j e c t ( $ i n t e r n a u t e ) ) {
/ / V é r i f i c a t i o n du mot d e p a s s e
i f ( $ i n t e r n a u t e−>mot_de_passe == md5( $mot_de_passe ) ) {
/ / T o u t v a b i e n On i n s è r e d a n s l a t a b l e S e s s i o n W e b
$ m a i n t e n a n t = d a t e ( "U" ) ;
$ t e m p s _ l i m i t e = $ m a i n t e n a n t + s e l f : : DUREE_SESSION ;
$ e m a i l = $ t h i s−>bd−>prepareChaine ( $email ) ;
$nom = $ t h i s−>bd−>prepareChaine ( $ i n t e r n a u t e −>nom) ;
$prenom = $ t h i s−>bd−>prepareChaine ( $ i n t e r n a u t e −>prenom ) ;
$ i n s S e s s i o n = " INSERT INTO S e s s i o n W e b ( i d _ s e s s i o n , e m a i l , nom , "
" prenom , t e m p s _ l i m i t e ) VALUES ( ’ $ i d _ s e s s i o n ’ , "
" ’ $ e m a i l ’ , ’ $nom ’ , ’ $prenom ’ , ’ $ t e m p s _ l i m i t e ’ ) " ;
$ r e s u l t a t = $ t h i s−>bd−>execRequete ( $ i n s S e s s i o n ) ;
r e t u r n t r u e ;
}
/ / Mot d e p a s s e i n c o r r e c t !
e l s e r e t u r n f a l s e ;
}
e l s e {
/ / L ’ u t i l i s a t e u r $ e m a i l e s t i n c o n n u
r e t u r n f a l s e ;
}
}
Si les deux tests successifs sont couronnés de succès, on peut créer la session On
dispose de toutes les informations nécessaires pour insérer une ligne dans SessionWeb
(identifiant, e-mail, nom et prénom), la seule subtilité étant la spécification de la durée de validité.
La fonction PHP date() permet d’obtenir la date et l’horaire courants sous de très nombreux formats En particulier la représentation « UNIX », en secondes depuis
le premier janvier 1970, est obtenue avec le format "U" L’expression date("U") donne donc le moment ó la session est créée, auquel il suffit d’ajouter le nombre de secondes définissant la durée de la session, ici 1 heure=3600 secondes, définie par la constante DUREE_SESSION de la classe Controleur.
La deuxième méthode vérifie qu’une session existante est valide Elle prend en
argument un objet PHP correspondant à une ligne de la table SessionWeb, et compare
l’attribut tempsLimite à l’instant courant Si la période de validité est dépassée, on détruit la session.
p r i v a t e f u n c t i o n s e s s i o n V a l i d e ( $ s e s s i o n )
{
/ / V é r i f i o n s q u e l e t e m p s l i m i t e n ’ e s t p a s d é p a s s é
$ m a i n t e n a n t = d a t e ( "U" ) ;
i f ( $ s e s s i o n−>t e m p s _ l i m i t e < $maintenant ) {
/ / D e s t r u c t i o n d e l a s e s s i o n
Trang 2s e s s i o n _ d e s t r o y ( ) ;
$ r e q u e t e = " DELETE FROM S e s s i o n W e b "
"WHERE i d _ s e s s i o n = ’ $ s e s s i o n−>i d _ s e s s i o n ’ " ;
$ r e s u l t a t = $ t h i s−>bd−>execRequete ( $ r e q u e t e ) ;
r e t u r n f a l s e ;
}
e l s e {
/ / C ’ e s t b o n ! On p r o l o n g e l a s e s s i o n
$ t e m p s _ l i m i t e = $ m a i n t e n a n t + s e l f : : DUREE_SESSION ;
$ p r o l o n g e = "UPDATE S e s s i o n W e b SET t e m p s _ l i m i t e = ’
$ t e m p s _ l i m i t e ’ "
" WHERE i d _ s e s s i o n = ’ $ s e s s i o n−>i d _ s e s s i o n ’ " ;
$ t h i s−>bd−>execRequete ( $ p r o l o n g e ) ;
}
r e t u r n t r u e ;
}
Enfin on a besoin d’un formulaire pour identifier les internautes Bien entendu, on
utilise la classe Formulaire, et une fonction qui prend en argument le nom du script
appelé par le formulaire, et un e-mail par défaut.
p r i v a t e f u n c t i o n f o r m I d e n t i f i c a t i o n ( $ u r l _ a u t h , $ e m a i l _ d e f a u t = " " )
{
/ / Demande d ’ i d e n t i f i c a t i o n
$ f o r m = new F o r m u l a i r e ( " p o s t " , $ u r l _ a u t h ) ;
$form−>debutTable ( ) ;
$form−>champTexte ( " Email " , " l o g i n _ e m a i l " , " $ e m a i l _ d e f a u t " ,
3 0 , 6 0 ) ;
$form−>champMotDePasse ( " P a s s e " , " l o g i n _ p a s s w o r d " , " " , 30) ;
$form−>champValider ( " I d e n t i f i c a t i o n " , " i d e n t " ) ;
$form−>f i n T a b l e ( ) ;
r e t u r n $form−>formulaireHTML ( ) ;
}
Nous voilà prêts à créer la méthode contrôlant les accès au site.
Initialisation des sessions
Chaque contrôleur dispose, par héritage de la classe Controleur, d’un objet session initialisé dans le constructeur par un appel à la méthode initSession() (voir le code du constructeur dans le chapitre précédent, page 245) Cette initialisation regarde si une session existe et vérifie qu’elle est valide Si oui, l’objet
session est créé, représentant la ligne de SessionWeb correspondant à la session
stockée Sinon l’objet session reste à null et on considère que l’utilisateur n’est pas connecté La fonction prend en argument l’identifiant de session.
p r o t e c t e d f u n c t i o n i n i t S e s s i o n ( $ i d _ s e s s i o n )
{
$ r e q u e t e = " SELECT ∗ FROM SessionWeb WHERE i d _ s e s s i o n = ’
$ i d _ s e s s i o n ’ " ;
Trang 3$ r e s u l t a t = $ t h i s−>bd−>execRequete ( $ r e q u e t e ) ;
$ t h i s−>s e s s i o n = $ t h i s −>bd−>o b j e t S u i v a n t ( $ r e s u l t a t ) ;
/ ∗ ∗
∗ On v é r i f i e que l a s e s s i o n e s t t o u j o u r s v a l i d e
∗ /
i f ( i s _ o b j e c t ( $ t h i s−>s e s s i o n ) ) {
/ / La s e s s i o n e x i s t e E s t − e l l e v a l i d e ?
i f ( ! $ t h i s−>s e s s i o n V a l i d e ( $ t h i s −>s e s s i o n ) ) {
$ t h i s−>vue−>c o n t e n t = "<b>Votre s e s s i o n n ’ e s t p a s ( ou
p l u s ) v a l i d e < b r / > </ b>\n " ;
$ t h i s−>s e s s i o n = n u l l ;
}
e l s e {
/ / La s e s s i o n e s t v a l i d e : on p l a c e l e nom / / d e l ’ u t i l i s a t e u r d a n s l a v u e p o u r p o u v o i r l ’ a f f i c h e r
$ t h i s−>vue−>session_nom = $ t h i s −>s e s s i o n −>prenom " "
$ t h i s−>s e s s i o n −>nom ;
}
}
/ / E t on r e n v o i e l a s e s s i o n ( q u i p e u t ê t r e n u l l )
r e t u r n $ t h i s−>s e s s i o n ;
}
Dans chaque action d’un contrôleur on peut tester si l’objet session existe ou pas Si non, il faut refuser l’accès aux actions reservées aux utilisateurs connectés On dispose pour cela de la méthode controleAcces() suivante, qui affiche un message
de refus d’accès si l’utilisateur n’a pas ouvert de session :
f u n c t i o n c o n t r o l e A c c e s ( )
{
i f ( ! i s _ o b j e c t ( $ t h i s−>s e s s i o n ) ) {
$ t h i s−>vue−>contenu = " Vous d e v e z ê t r e i d e n t i f i é "
" p o u r a c c é d e r à c e t t e page < b r / > " ;
echo $ t h i s−>vue−>r e n d e r ( " page " ) ;
e x i t ;
}
}
À titre d’exemple voici l’action index du contrôleur Notation On commence par appeler controleAcces(), et on sait ensuite, si l’action continue à se dérouler, que l’utilisateur est connecté On dispose même de l’objet $this->session pour accéder à ses prénom, nom et e-mail si besoin est.
f u n c t i o n i n d e x ( )
{
/ / D é f i n i t i o n du t i t r e
$ t h i s−>vue−>t i t r e _ p a g e = " Recherche e t n o t a t i o n de s f i l m s " ; / / C o n t r ô l e d e l a s e s s i o n
$ t h i s−>c o n t r o l e A c c e s ( ) ;
/ / M a i n t e n a n t n o u s s o mmes i d e n t i f i é s
Trang 4$ t h i s−>vue−> s e t F i l e ( " contenu " , " n o t a t i o n t p l " ) ;
/ / P r o d u c t i o n du f o r m u l a i r e d e r e c h e r c h e
$ t h i s−>vue−>f o r m u l a i r e = $ t h i s −>formRecherche ( ) ;
echo $ t h i s−>vue−>r e n d e r ( " page " ) ;
}
Finalement on dispose d’une méthode statutConnexion() qui se charge de placer dans la vue les informations relatives à la session courante Deux cas sont possibles :
1 soit la session existe, et on affiche le nom de l’utilisateur connecté, avec un lien de déconnexion ;
2 soit elle n’existe pas, et on affiche le formulaire de connexion.
Cette information est placée dans l’entité auth_info de la vue Notez dans le code l’exploitation des informations de l’objet $this->session
p r o t e c t e d f u n c t i o n s t a t u t C o n n e x i o n ( )
{
/ / S ’ i l n ’ y a p a s d e s e s s i o n : on a f f i c h e l e f o r m u l a i r e
/ / d ’ i d e n t i f i c a t i o n , s i n o n on p l a c e un l i e n d e d é c o n n e x i o n
i f ( $ t h i s−>connexion ( ) ) {
$ t h i s−>vue−>a u t h _ i n f o = " Vous ê t e s "
$ t h i s−>s e s s i o n −>prenom " " $ t h i s −>s e s s i o n −>nom " "
" Vous p o u v e z v o u s <a h r e f = ’ ? c t r l = a u t h& ; a c t i o n = l o g o u t ’ >" " d é c o n n e c t e r < / a > à t o u t moment " ;
}
e l s e {
$ t h i s−>vue−>a u t h _ i n f o =
$ t h i s−>F o r m I d e n t i f i c a t i o n ( " ? c t r l =auth& ; a c t i o n = l o g i n " );
}
}
7.1.3 Les actions de login et de logout
Ces deux actions font partie du contrôleur Auth L’action login reçoit un em-ail et un
mot de passe (qu’il faut vérifier) et tente de créer une session avec les utilitaires de gestion de session hérités de la classe Controleur.
f u n c t i o n l o g i n ( )
{
$ t h i s−>t i t r e _ p a g e = " I d e n t i f i c a t i o n " ;
/ / S i on e s t d é j à c o n n e c t é : on r e f u s e
i f ( i s _ o b j e c t ( $ t h i s−>s e s s i o n ) ) {
$ t h i s−>vue−>contenu = " Vous ê t e s d é j à connecté Déconectez−
v o u s "
" au p r é a l a b l e a v a n t de c h o i s i r un a u t r e compte " ;
}
Trang 5e l s e i f ( i s S e t ( $_POST [ ’ l o g i n _ e m a i l ’ ] ) and
i s S e t ( $_POST [ ’ l o g i n _ p a s s w o r d ’ ] ) ) {
/ / Une p a i r e e m a i l / mot d e p a s s e e x i s t e E s t− e l l e c o r r e c t e ?
i f ( $ t h i s−>c r e e r S e s s i o n ($_POST [ ’ l o g i n _ e m a i l ’ ] ,
$_POST [ ’ l o g i n _ p a s s w o r d ’ ] , s e s s i o n _ i d ( ) ) ) {
/ / On i n i t i a l i s e l ’ o b j e t s e s s i o n a v e c l e s d o n n é e s qu ’ on / / v i e n t d e c r é e r
$ t h i s−>i n i t S e s s i o n ( s e s s i o n _ i d ( ) ) ;
/ / A f f i c h a g e d ’ u n e p a g e d ’ a c c u e i l s y m p a t h i q u e
$ t h i s−>vue−> s e t F i l e ( " contenu " , " a u t h _ l o g i n t p l " ) ;
}
e l s e
$ t h i s−>vue−>contenu = " < c e n t e r ><b> V o t r e i d e n t i f i c a t i o n
a é c h o u é < / b > </ c e n t e r >\n " ; }
e l s e {
$ t h i s−>vue−>contenu = " Vous d e v e z f o u r n i r v o t r e e m a i l e t
v o t r e mot de p a s s e < b r / > " ; }
/ / R a f r a i c h i s s e m e n t d e l a p a r t i e du c o n t e n u q u i m o n t r e s o i t / / un f o r m u l a i r e , d e c o n n e x i o n , s o i t un l i e n d e d é c o n n e x i o n
$ t h i s−>s t a t u t C o n n e x i o n ( ) ;
echo $ t h i s−>vue−>r e n d e r ( " page " ) ;
}
La figure 7.1 montre la présentation du site juste après l’identification d’un inter-naute Outre le message d’accueil dans la partie centrale, on peut noter que le statut
de connexion affiché dans le menu à droite montre maintenant les prénom et nom
de l’internaute connecté, ainsi qu’un lien qui pointe vers l’action de déconnexion logout.
Cette dernière vérifie que l’internaute est bien connecté (autrement dit, que l’objet session existe) et effectue alors une destruction dans la table, ainsi que par appel à la fonction PHP session_destroy() L’objet session est également remis
à null et le bloc d’information dans la vue réinitialisé.
p u b l i c f u n c t i o n l o g o u t ( )
{
$ t h i s−>vue−>t i t r e _ p a g e = " Déconnexion " ;
/ / V é r i f i o n s qu ’ on e s t b i e n c o n n e c t é
i f ( i s _ o b j e c t ( $ t h i s−>s e s s i o n ) )
{
$ t h i s−>vue−>contenu = " Vous é t i e z i d e n t i f i é s o u s l e nom "
" <b > { $ t h i s−>s e s s i o n −>prenom } { $ t h i s −>s e s s i o n −>nom} </ b>
< b r / > " ;
s e s s i o n _ d e s t r o y ( ) ;