Vous êtes sur la page 1sur 6

Authentification avec $_SESSION

Dans ce qui suit, nous allons faire un exemple dauthentification. On a une page
login qui permet de saisir le nom dutilisateur et le mot de passe comme le
montre la figure suivante :

Le code source de cette page login.php est :


<!Doctype html>
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<form class="form-horizontal" action="LoginProcess.php" method="POST">
<legend>Authentification</legend>
<div class="form-group">
<label class="col-md-2 control-label">Login</label>
<div class="col-md-2">
<input class="form-control" name="login" type="text" />
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">Mot de passe</label>
<div class="col-md-2">
<input class="form-control" name="password" type="password"
/>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input class="btn btn-primary" type="submit" value="Login"
/>
</div>
</div>
</form>
</div>
</body>
</html>

En cliquant sur le bouton Login, le nom dutilisateur et le mot de passe seront


envoys vers la page LoginProcess.php :
<?php
if($_SERVER["REQUEST_METHOD"]== "POST" && !empty($_POST)) {
// on recupre nos valeurs
$login = htmlentities(trim($_POST['login']));
$pass = htmlentities(trim($_POST['password']));
$role ='';
if ($login == 'Admin' && $pass == 'admin') {
$role = 'Admin';
//Construction d'un tableau deux dimensions
$Personne = array("login" => $login, "role" => $role);
} elseif ($login == 'Etud' && $pass == 'etud') {
$role = 'Etud';
//Construction d'un tableau deux dimensions
$Personne = array("login" => $login, "role" => $role);
}

if (isset($Personne)) {
session_start();
$_SESSION['PROFILE'] = $Personne;
//Redirection vers la pages des livres
header ("location: livres.php");
} else {
//Retour la page login.php
header ("location: login.php");
}
} else {
header ("location: login.php");
}
?>

Normalement, dans cette page, on vrifie les donnes avec une base de
donnes. Mais pour le moment, on vrifie juste deux types dutilisateurs :
- Admin avec mot de passe admin
- Etud avec mot de passe etud

On construit un tableau 2 dimonsions : le login et le rle.


Puis, on vrifie la variable $Personne, si elle est Admin ou Etud, on stocke dans la
variable de session, cette personne et on se redirige vers la page livres.php,
sinon on retourne la login.php

On aimerait bien avoir un message derreur disant que le nom dutilisateur et le


mot de passe sont incorrects. Pour cela, nous allons placer dans lURL de retour
un paramtre comme cei (toujours dans la page LoginProcess.php):
<?php
...
if (isset($Personne)) {
session_start();
$_SESSION['PROFILE'] = $Personne;
//Redirection vers la pages des livres
header ("location: livres.php");
} else {
//Retour la page login.php
header ("location: login.php?error=Utilisateur non identifi");
}
} else {
header ("location: login.php?error=Pas d'utilisateur");
}
?>

Il faut donc modifier la page login.php, pour prendre en compte ce paramtre qui
sera stock dans le tableau $_GET[error] :

Le fichier login.php devient :


<?php
//on initialise nos messages d'erreurs;
$error = '';
if($_SERVER["REQUEST_METHOD"]== "GET" && !empty($_GET)) {
// on recupre nos valeurs
$error = htmlentities(trim($_GET['error']));
}

?>
<!Doctype html>
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<form class="form-horizontal" action="LoginProcess.php" method="POST">
<legend>Authentification</legend>
<?php if(!empty($error)):?>
<p class="alert alert-danger"><?php echo $error ;?></p>
<?php endif;?>

Si la variable $error nest pas vide, alors nous allons ajouter un paragraphe avec
le message derreur pass en paramtre.

<div class="form-group">
<label class="col-md-2 control-label">Login</label>
<div class="col-md-2">
<input class="form-control" name="login" type="text" />
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">Mot de passe</label>
<div class="col-md-2">
<input class="form-control" name="password" type="password"
/>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input class="btn btn-primary" type="submit" value="Login"
/>
</div>
</div>
</form>
</div>
</body>
</html>

Le fichier livres.php, contient une barre de navigation et la liste des livres,


comme le montre la figure suivante :

Quelquun peut directement mettre dans le navigateur le chemin de ce fichier


livres.php sans passer par lauthentification ce qui va afficher cette page. Donc,
cest une faille de scurit contre laquelle il faut se protger. Pour cela, on doit
vrifier la variable de session comme suit (fichier livres.php) :

<?php require_once("securite.php"); ?>

<!Doctype html>
<html>
<head>
<title>Livres</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<?php require_once("entete.php"); ?>
<div class="container">
<div class="well">
<h1>Liste des livres</h1>
<p>Dans cette partie, on se connecte la base de donnes pour
extraire la liste des livres</p>
</div>
</div>
</body>
</html>

Le fichier securite.php contient le code suivant :


<?php
session_start();
//Si aucun utilisateur n'est identifi, redirection vers la page login.php
if (!isset($_SESSION['PROFILE'])) {
header("location: login.php");
}
?>

Explication : Rappelez-vous que dans le fichier LoginProcess.php, nous avons


cr une variable de session qui contient un tableau personne (login et role).
Au tlchargement du fichier livres.php, le navigateur vrifie si la variable
$_SESSION['PROFILE'], existe ou non. Dans le cas o elle nexiste pas, on sera
redirig vers la page login.php.

Le fichier entete.php contient le code suivant :

<nav class="navbar navbar-default">


<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">Miniprojet - PHP</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="livres.php">Liste des livres</a></li>
<li><a href="new_livre.php">Nouveau livre</a></li>
<li><a href="logout.php">LogOut <?php echo
isset($_SESSION['PROFILE'])?$_SESSION['PROFILE']['login']:''; ?></a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>

Explication : Dans le menu Logout, on ajoute le nom de lutilisateur qui vient de


se connecter :
La ligne <?php echo isset($_SESSION['PROFILE'])?$_SESSION['PROFILE']['login']:'';
?> peut scrire :

if (isset($_SESSION['PROFILE'])) {
echo $_SESSION['PROFILE']['login'] ;
} else {
echo '' ;
}

En cliquant sur le menu logout, on sera dconnecter et on sera rediriger vers la


page de dbut. Le code source du fichier logout.php est :
<?php
session_start();
session_destroy();
//Redirection vers la page login.php aprs avoir librer les ressources
header("location:login.php");
?>
Avec session_destroy(), la variable $_SESSION['PROFILE'] sera libre.

Dernier point, le fichier new_livre.php ne sera affich que si lutilisateur est


Admin, sinon on sera redirig vers la page prcdente :
<?php
require_once("securite.php");
//Si l'utilisateur diffrent de l'Admin, alors retour sa page prcdente
if (!($_SESSION['PROFILE']['role'] == 'Admin')) {
header("location:" . $_SERVER['HTTP_REFERER']);
}
?>
<!Doctype html>
<html>
<head>
<title>Livres</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<?php require_once("entete.php"); ?>
<div class="container">
<div class="well">
<h1>Nouveau Livre</h1>
<p>On ne peut crer un livre que si on est Admin.</p>
</div>
</div>
</body>
</html>