Accueil » Tutoriaux » cakePHP » Avec cake, les sessions c'est du gateau !
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() {
        // initialisation de la variable $error
        // On a pas d'erreur (pour le moment)
        $this->set('error', false);
        // si un utilisateur fait une requete :
        if (!empty($this->data)) {
            // tout d'abord, on test si l'utilisateur existe dans la table
            $someone = $this->Utilisateur->findByPseudo($this->data['Utilisateur']['pseudo']);
            // la variable $someone contient toute les données de l'utilisateur
            // Maintenant, il nous faut comparer le mot de passe de la table avec celui saisi.
            if(!empty($someone['Utilisateur']['motdepasse']) && $someone['Utilisateur']['motdepasse'] == $this->data['Utilisateur']['motdepasse']) {
                // si nous sommes ici, c'est que le mot de passe correspond

                // on peut maintenant créer une session et enregistrer l'utilisateur comme authentifié
                $this->Session->write('User', $someone['Utilisateur']['id']);

                // on viens de stocker dans la variable de session le pseudo du client

                // maintenant que nous avons enregistré une variable de session,
                // nous pouvons faire la redirection vers le dossier spécifié
                $this->redirect('/utilisateurs/view/'.$someone['Utilisateur']['id']);
            }

            // sinon, ça signifie qu'on a des données incorrect :
            else {
                // on met la variable $error à vrai pour signaler qu'on a une erreur
                $this->set('error', true);
            }
        }
    }

    function logout() {
        // suppression de la session Utilisateur
        $this->Session->delete('Utilisateur');
        // et la redirection
        $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() {
        // Si la session n’existe pas (ou du moins les informations de celle-ci ne sont pas renseignées)
        if (!$this->Session->check('User')) {
            // On redirige l’utilisateur vers l’authentification pour qu’il se connecte
            $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){
// on test si la variable de session est la meme que l'id passé en parametre
                if ($id != $this->Session->read('User')) {
                                $this->redirect('/utilisateurs/login'); // on redirige vers la page de login
                                exit; // on arrete tout
                }
                // si c'est bon :
                $this->verif();  // on vérifie l'existance de la session
                $this->Utilisateur->id = $id; // parametre de la selection des données
                $this->set('client',$this->Utilisateur->read()); // on envoi les données du client a la vue
                $this->set('admin',$this->Utilisateur->findAll());  // on envoi toutes les données de la table
}

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 :