Raccourcis : Contenu - rubriques - sous rubriques
EN FR

Quand vous voulez que votre module fonctionne selon des droits, il vous faut durant la réalisation de ce module :

  1. déterminer des sujets (droits) que vous utiliserez
  2. éventuellement les enregistrer dans le système de droits utilisé par le driver que vous indiquez à jAcl2 : dans un annuaire ldap si vous utilisez un driver ldap (non fourni pour le moment) ou une base de données si vous utilisez par exemple le driver jAcl2.db.

Ensuite vous pouvez utiliser les méthodes statiques de jAcl2 pour savoir si l'utilisateur courant a tel droit sur tel ou tel sujet.

Si le driver gère des groupes d'utilisateurs, vous n'avez pas à les indiquer lors de ces interrogations : le driver s'en occupe automatiquement. Notez qu'un driver pour jAcl2 peut utiliser jAuth pour l'authentification.

Configuration

Avant toute chose vous devez indiquer quel driver vous utilisez pour jAcl2. Les drivers sont des plugins stockés dans un répertoire acl2 d'un dépôt de plugins. Un plugin pour jAcl2 est une classe fooAcl2Driver (foo étant le nom du plugin) qui doit implémenter l'interface jIAcl2Driver et qui est enregistrée dans un fichier foo.acl2.php. Par exemple le driver "db" est stocké dans db/db.acl2.php et est défini dans la classe dbAcl2Driver.

Dans la configuration de l'application, vous devriez avoir une section acl2 :


[acl2]
driver=db

Au niveau de l'option driver vous devez y mettre le nom du driver utilisé.

Interrogation du système de droit

Comme jAcl2 se charge de découvrir l'utilisateur actuel, vous n'avez qu'une méthode statique de jAcl2 à connaître pour 99% des cas : check.

jAcl2::check

C'est probablement la méthode que vous utiliserez le plus avec jAcl2. Elle permet de savoir si l'utilisateur a tel ou tel droit, et renvoie donc true ou false. Exemple :


if( jAcl2::check("cms.articles.create")){
   // code à exécuter si l'utilisateur a le droit de créer un article

}else{
   // code à exécuter si l'utilisateur n'a pas le droit de créer un article
}

Pour interroger sur une ressource précise :


$article_id = "opinions";

if( jAcl2::check("cms.articles.update", $article_id)){
   // code à exécuter si l'utilisateur a le droit de modifier l'article indiqué

}else{
   // code à exécuter si l'utilisateur n'a pas le droit de modifier l'article indiqué
}

Vérification automatique

Dans les contrôleurs dont on veut vérifier les droits automatiquement, on peut utiliser le plugin jacl2 pour le coordinateur.

Pour ce faire, activez le plugin jacl2 dans la configuration de l'application


[coordplugins]
jacl2 = jacl2.coord.ini.php

Copiez le fichier lib/jelix/plugins/coord/jacl2/jacl2.coord.ini.php.dist dans var/config/index/jacl2.coord.ini.php

Éditez ce fichier pour indiquer les actions vers lesquelles aller en cas de défaut de droits, ou le message à afficher.

Et dans vos contrôleurs, mettez les valeurs suivantes dans la propriété $pluginParams :



   public $pluginParams = array(
        '*' => array( 'jacl2.right'=>'sujet', ...)
        ...
   );

Ou alors, pour vérifier une série de droits que l'utilisateur doit posséder :



   public $pluginParams = array(
     '*' => array( 'jacl2.rights.and'=>array('sujet1', 'sujet2', ..)
            ),
        ...
   );

ou encore, pour vérifier que l'utilisateur possède un des droits parmi une liste :



   public $pluginParams = array(
     '*' => array( 'jacl2.rights.or'=>array('sujet1', 'sujet2', ..)
            ),
        ...
   );

Plugins de template ifacl2 et ifnotacl2

Des plugins de templates sont disponibles pour générer des portions de contenus en fonction des droits. Leurs arguments sont exactement les mêmes que jAcl2::check.


  {ifacl2 "cms.articles.create"}
    <input type="button" value="Créer un article" />
  {else}
   <p>Vous ne pouvez pas créer d'articles.</p>
  {/ifacl2}

Il y aussi {ifnotacl2} qui est le contraire de ifacl2, c'est à dire qui teste si l'utilisateur n'a pas le droit indiqué.

La même chose avec une ressource :


  {ifacl2 "cms.articles.update", $article_id}
    <input type="button" value="Modifier l'article" />
  {/ifacl2}