Avec Cake, les sessions c'est du gateau !!
J’ai décidé de faire un tutoriel sur un espace membre avec différent type de droits comme administrateur et client. C’est souvent utile lors du développement d’un site de commerce par exemple.
Je souhaite également faire seulement le principal, pas de mise en page, pas de fonction qui ne sert à rien. Voici une liste des options que nous allons développer par la suite :
- Pour l'administrateur, affichage de tout les membres, pour les autres, affichage d'un message.
- Fonctionnement d’une session sous cake.
1. Créer une session
Tout
d’abord, il faut créer une base de données !
Voici un
exemple d’une table :
CREATE TABLE `utilisateurs` (
`id` int(11) NOT NULL auto_increment,
`pseudo` varchar(255) NOT NULL,
`motdepasse` varchar(32) NOT NULL,
`droit` enum('admin', 'client'),
PRIMARY KEY (`id`)
)
Insert into utilisateurs (pseudo, motdepasse, droit) values (‘pierre’,’petit’,’client’) ;
Insert into utilisateurs (pseudo, motdepasse, droit) values (‘jacque’,’henry’,’admin’) ;
Cette table suffit pour ce que nous voulons faire.
Tout d’abord, créez le modèle qui correspond, c'est-à-dire le fichier app/models/utilisateur.php avec le code suivant
<?php
class Utilisateur extends AppModel {
var $name = 'Utilisateur';
}
?>
Ensuite place au controleur.
<?php
class UtilisateursController extends AppController {
var $name = 'Utilisateurs';
function login() {
$this->set('error', false);
if (!empty($this->data)) {
$someone = $this->Utilisateur->findByPseudo($this->data['Utilisateur']['pseudo']);
if(!empty($someone['Utilisateur']['motdepasse']) && $someone['Utilisateur']['motdepasse'] == $this->data['Utilisateur']['motdepasse']) {
$this->Session->write('User', $someone['Utilisateur']['id']);
$this->redirect('/utilisateurs/view/'.$someone['Utilisateur']['id']);
}
else {
$this->set('error', true);
}
}
}
function logout() {
$this->Session->delete('Utilisateur');
$this->redirect('/utilisateurs/login');
}
}
?>
Note : Il se peut que le mot de passe
soit crypté dans la base de données. Votre comparaison devrait alors ressembler
à ça :
md5($this->data['User']['password']) == ...
Voilà ce que vous abtenez :
Et pour terminer la connexion, voyons voir la vue dans le fichier
/app/view/utilisateurs/login.thtml :
<?php if
($error) { ?>
<p
style="color:red ;">Votre pseudo ou mot de passe n'a pas été
correctement saisie. Veuillez réessayer.</p>
<?php }
?>
<form
action="<?php echo $html->url('/utilisateurs/login'); ?>"
method="post">
<div>
<label for="pseudo">Pseudo :</label>
<?php echo $html->input('Utilisateur/pseudo', array('size' =>
20)); ?>
</div>
<div>
<label for="motdepasse">Mot
de passe:</label>
<?php echo $html->password('Utilisateur/motdepasse', array('size'
=> 20)); ?>
</div>
<div>
<?php echo $html->submit('Valider'); ?>
</div>
</form>
Comment tester si la session existe ?
Pour pouvoir
l’utiliser dans tous les contrôleurs, nous allons modifier un fichier dans le
dossier principal (/cake/).C ‘est le fichier appelé app_controller.php.
Voici le
code :
class
AppController extends Controller {
function checkSession() {
if (!$this->Session->check('User')) {
$this->redirect('/utilisateurs/login');
exit();
}
}
?>
Voilà, vous avez maintenant une fonction qui va empêcher les malins de rentrer dans votre espace membres.
Maintenant, modifiez le code de votre contrôleur :
function verif() {
$this->checkSession();
}
C’est fini pour la session. On doit
maintenant ajouter le contenu dans l’espace membres.
Tout
d’abord, nous allons créer une nouvelle méthode pour l’affichage :
function view($id){
if ($id != $this->Session->read('User')) {
$this->redirect('/utilisateurs/login');
exit;
}
$this->verif();
$this->Utilisateur->id =
$id;
$this->set('client',$this->Utilisateur->read());
$this->set('admin',$this->Utilisateur->findAll());
}
Et enfin,
création de la vue : /app/view/utilisateurs/view.thtml
Cette vue
affiche en fonction de vos droits, soit tout les clients de la table, soit un
message avertissant de l’insuffisance des droits.
<h1><?php
echo 'Bienvenue : '.$client['Utilisateur']['pseudo']; ?></h1>
<br
/><br />
<?php
if
($client['Utilisateur']['droit'] == 'admin') {
echo'Vous etes administrateur.
Voici les autres membres avec leurs droits : ';
echo'<table>
<tr>
<th>Pseudo</th>
<th>Droits</th>
</tr>
';
foreach
($admin as $listing):
echo
'<tr>
<td>'.$listing['Utilisateur']['pseudo'].'</td>
<td>'.$listing['Utilisateur']['droit'].'</td>
</tr>';
endforeach;
echo'</table>';
}
else {
echo 'vous n\'avez pas les
droits necessaires.';
}
?>
<br
/><br />
<?php
echo $html->link("Déconnexion", "/utilisateurs/logout");
?>
Et
voilà ! C’est assez simple pour faire ce genre d’application. Maintenant,
laissez place à votre imagination !!
Deux captures d'écran pour l'administrateur, et un client :