Table des matières

Tutoriel : La classe jAuth

Vous apprendrez dans cet article comment utiliser jAuth.

Ce tutoriel n’est pas destiné à créer un outils de production mais peut servir de base à votre compréhension de Jelix. Il va permettre de développer toute une série d'actions qui va montrer tous les aspects d'utilisation de jAuth.

Pré-requis

Vous devez avoir fait le mini-tutoriel et le tutoriel principal si vous n'êtes pas encore à l’aise avec Jelix. Nous utiliserons le même type d’installation que celle du mini-tutoriel. Nous vous conseillons également la lecture du chapitre concernant jAuth avant d'aborder ce tutoriel.

Ce tutoriel est fait pour Jelix 1.5. Si vous utilisez une autre version, peut être que des choses sont à changer..

Créé une application

Dans un premier temps on crée une application, c’est à dire créer l’application et le module/action par défaut. Pour réaliser cette tâche vous devez ouvrir une console ou une fenêtre ‘invite de commandes’ pour travailler en ligne de commandes et vous déplacer dans le répertoire jelix/lib/jelix-scripts. À cet endroit vous tapez:

php createapp.php ../../auth1

Le fichier de configuration

Il faut activer le plugin de coordinateur “auth”, et créer un fichier de configuration pour ce plugin, “auth.plugin.ini.php”.

Pour ce faire, installer le module jauth

$ cd ../../auth1/
$ php cmd.php installmodule jauth

Dans le fichier /jelix/auth1/var/config/defautconfig.ini.php vous devriez avoir.

[plugins]
auth = "auth.plugin.ini.php"

Et dans le repertoire /jelix/auth1/var/config/, vous devriez avoir auth.plugin.ini.php.

Configuration classique du plugin

Tel que décrit dans la section driver db de jauth, on va utiliser le driver “Db” pour l'authentification. C'est un driver qui utilise une table en base de données pour stocker les utilisateurs. Il repose sur l'utilisation d'un dao, que l'on indique au niveau du paramètre “dao”. Ici on utilise le dao fourni par défaut avec jelix, mais vous pouvez fournir un autre dao, du moment qu'il contient au moins toutes les propriétés et méthodes de celui par défaut. Vous pouvez ainsi ajouter toutes les propriétés que vous souhaitez.

Pour utiliser ce driver, il faut

* configurer l'accès à la base de donnée * installer le module “jauthdb”

Pour la base de donnée, ouvrez le fichier auth1/var/config/profiles.ini.php, et modifiez le pour indiquer les paramètres d'accès. Voici un exemple :

[jdb]
default = "auth1"
 
[jdb:auth1]
driver="mysql"
database="jelix"
host= "localhost"
user= "root"
password= unmotdepasse
persistent= on

Ensuite installez le module jauthdb :

php cmd.php installmodule jauthdb

L'installation du module va créé une table jlx_user en base de donnée :

CREATE TABLE IF NOT EXISTS `jlx_user` (
  `usr_login` VARCHAR(50) NOT NULL DEFAULT '',
  `usr_password` VARCHAR(120) NOT NULL DEFAULT '',
  `usr_email` VARCHAR(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`usr_login`)
) ENGINE=MyISAM ;

Un utilisateur a été créé :

- son login : admin - son mot de passe : admin

Et l'installation va modifier le fichier auth.plugin.ini.php.

  driver = Db
  on_error_action = "jauth~login:out"
  after_login = "auth1~default:index"
  after_logout = "jauth~login:form"
  on_error_sleep = 3
  [Db]
  dao = "jauthdb~jelixuser"

Le contrôleur

Nous arrivons à l’essentiel du tutoriel, le contrôleur, les actions ou si vous préférez les ressources. Remplacez le contenu du fichier /jelix/auth1/modules/auth1/controllers/default.classic.php avec le code suivant:

class defaultCtrl extends jController{
  /*
  * Définition des accès gérés par jAuth
  */
  public $pluginParams = array(
        '*'        => array('auth.required' => false),
        'affiche1' => array('auth.required' => true),
  );
 
  /*
  * La page d'accueil et par défaut
  */
  function index(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    $tpl = new jTpl();
    $rep->body->assign('MAIN', '<p>Contenu de la page d\'accueil.</p>');
 
    return $rep;
  }
 
  /*
  * Cette action ne peut être exécutée que si vous être connecté
  */ 
  function affiche1(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    $tpl = new jTpl();
    $rep->body->assign('MAIN', $tpl->fetch('auth1~affichage1'));
 
    return $rep;
  }
 
  /*
  * Cette action accepte l'affichage du template affichage2 
  * que si personne n'est connecté
  */
  function affiche2(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    // utilisation de jAuth::isConnected pour savoir si l'utilisateur
    // est actuellement identifié ou pas
    if(!jAuth::isConnected()){      
        $tpl = new jTpl();
        $rep->body->assign('MAIN', $tpl->fetch('auth1~affichage2'));
    }else{
        $rep->body->assign('MAIN', 'L\'accès à cette page est refusé!! (si vous êtes connecté)'); 
    }
    return $rep;  	
  }
 
  /*
  * Change le mot de passe d'un user
  */ 
  function changePwd(){  
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main'; 
 
    jAuth::changePassword('user10','jelix');
    $rep->body->assign('MAIN', 'Le mot de passe du "user10" à été modifié'); 
 
    return $rep; 
  }
 
  /*
  *  Affiche tous les users
  */
  function listusers(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    $content = 'Les users enregistrés sont:<br />';
    $users = jAuth::getUserList();
    foreach($users as $user){
       $content .= $user->login . '<br />'; 
    }
    $rep->body->assign('MAIN', $content);
 
    return $rep; 
  }   
 
  /*
  * Affiche le user courrant de la session
  */  
  function getCurrentUser(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    try{
      $user = jAuth::getUserSession();
      $rep->body->assign('MAIN', "Le user courant est ".$user->login);
    }catch(Exception $e){
      $rep->body->assign('MAIN', 'Il n\'y a plus de user de connecté!');
    }
 
    return $rep; 
  }
 
  /*
  * Récupère un user
  */        
  function getUser(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    try{
      $user = jAuth::getUser('user100');
      if($user){
        $rep->body->assign('MAIN', '"user100" à été trouvé.');
      }else{
        $rep->body->assign('MAIN', '"user100" est introuvable.');
      }
    }catch(Exception $e){
      $rep->body->assign('MAIN', 'Le user user100 n\a pus être trouvé!');
    } 
 
    return $rep; 
  }
 
  /*
  * Vérifie le password d'un user
  * Peut être utilisé lors d'un login
  * Dans cet exemple le retour sera toujours un password non valide
  * parce que l'appel à cette action n'a aucun paramètre...
  */
  function verifiePwd(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    $r = jAuth::verifyPassword('user100', $this->param('password'));
    if(!$r){
      $rep->body->assign('MAIN', 'Le pwd du user100 est non valide.'); 
    }else{
      $rep->body->assign('MAIN', 'Le pwd du user100 est valide.'); 
    }
 
    return $rep; 
  }
 
  /*
  * Crée un user en session et en DB
  */
  function createUser(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    // creation d'un user avec le login tempuser et le mot de passe pwtempuser       
    $newUser = jAuth::createUserObject('tempuser','pwtempuser');
    $newUser->email = 'tempuser@cie.com';
 
    try{
      $user = jAuth::saveNewUser($newUser); 
      $rep->body->assign('MAIN', 'Le user : '. $user->login .' vient d\'être créé!'); 
    }catch(Exception $e){
      $rep->body->assign('MAIN', 'Impossible d\'ajouter ce nouvel utilisateur!');
    }   
 
    return $rep; 
  }
 
  /*
  * Met à jour un user existant
  */
  function updateUser(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    $updUser = jAuth::getUser('tempuser');
    if($updUser){
      $updUser->email = 'jelix@cie.com';
      try{
        jAuth::updateUser($updUser); 
 
        // Pour vérifier visuelement la modification	
        $user = jAuth::getUser('tempuser');
        $rep->body->assign('MAIN', 'Le nouveau courriel du user tempuser : '. $user->email);
      }catch(Exception $e){
	$rep->body->assign('MAIN', 'La mise à jour du user tempuser à échoué! ');	
      }
    }else{
      $rep->body->assign('MAIN', 'Le user tempuser n\'existe pas!');
    }
 
    return $rep;
  }
 
  /*
  * Efface un user de la session et de la DB
  */
  function deleteUser(){
    $rep = $this->getResponse('html');
    $rep->bodyTpl = 'main';
 
    if(jAuth::getUser('tempuser')){
      if(jAuth::removeUser('tempuser')){
        $rep->body->assign('MAIN', 'Le user tempuser a été effacé!');
      }else{
        $rep->body->assign('MAIN', 'Le user tempuser n\'a pas été effacé!');
      }
    }else{
      $rep->body->assign('MAIN', 'Le user tempuser n\'existe pas!');
    }
 
    return $rep;
  }
 
}

Le template main

Créez le fichier qui servira de template principal. Il est nommé main.tpl et doit être créé dans le répertoire /jelix/auth1/modules/auth1/templates/.

<h2>Tutoriel pour la jAuth</h2>
<p>Liste des users dans la DB<br />
user10/user10 ou user10/jelix<br />
user20/user20<br />
user100/user100<br /></p>
<hr />
{$MAIN}
<hr />
<ul>
  <li><a href="{jurl 'jauth~login:form'}">login</a></li>   
  <li><a href="{jurl 'jauth~login:out'}">logout</a></li>  
</ul>
<hr />
<ul>
  <li><a href="{jurl 'auth1~default:index'}">Page d'accueil</a></li>
  <li><a href="{jurl 'auth1~default:affiche1'}">Affichage privé</a></li>
  <li><a href="{jurl 'auth1~default:affiche2'}">Interdit si connecté!</a></li> 
</ul>
<hr />
<ul>  
  <li><a href="{jurl 'auth1~default:listusers'}">Affiche les users</a></li> 
  <li><a href="{jurl 'auth1~default:getCurrentUser'}">Le user courant</a></li> 
  <li><a href="{jurl 'auth1~default:getUser'}">Recherche le user100</a></li> 
  <li><a href="{jurl 'auth1~default:verifiePwd'}">Vérifie le pwd de "user100"</a></> 
  <li><a href="{jurl 'auth1~default:changePwd'}">Modifie un pwd</a></>
</ul>
<hr />
<ul>  
  <li><a href="{jurl 'auth1~default:createUser'}">Crée "tempuser"</a></li>
  <li><a href="{jurl 'auth1~default:updateUser'}">Update "tempuser" vers "jelix"</a></li>
  <li><a href="{jurl 'auth1~default:deleteUser'}">Efface le user "jelix"</a></li>
</ul>

Le template affichage1

Créez le fichier template qui nécessite une authentification. Il est nommé affichage1.tpl et doit être créé dans le répertoire /jelix/auth1/modules/auth1/templates/.

<p>Contenu pour l'affichage 1 (avec authentification....)</p>

Le template affichage2

Créez le fichier template qui ne nécessite aucune authentification. Il est nommé affichage2.tpl et doit être créé dans le répertoire /jelix/auth1/modules/auth1/templates/.

<p>Contenu pour l'affichage 2</p>
<p>Cette page s'affiche uniquement si vous n'êtes pas connecté</p>