<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 15783 -->
<!-- Reviewed: no -->
<sect1 id="zend.acl.refining">
    <title>Affiner les Contrôles d'Accès</title>

    <sect2 id="zend.acl.refining.precise">
        <title>Mieux définir les Contrôles d'Accès</title>

        <para>
            L'<acronym>ACL</acronym> basique définie dans le
            <link linkend="zend.acl.introduction">chapitre précédent</link>montre comment plusieurs
            privilèges peuvent être alloués pour l'ensemble de l'<acronym>ACL</acronym> (toutes les
            ressources). En pratique, toutefois, les contrôles d'accès ont souvent des exceptions et
            des degrés de complexité variables. <classname>Zend_Acl</classname> permet d'atteindre
            ce degré de finesse d'une manière directe et flexible.
        </para>

        <para>
            Pour l'exemple du <acronym>CMS</acronym>, nous avons déterminé que bien que le groupe
            "Staff" couvre les besoins de la plupart des utilisateurs, un groupe "Marketing" est
            nécessaire. Ce groupe doit avoir accès à la newsletter et aux dernières news dans le
            <acronym>CMS</acronym>. Le groupe va recevoir la possibilité de publier et d'archiver à
            la fois des newsletters et des news.
        </para>

        <para>
            De plus, il a été demandé que le groupe "Staff" puisse voir les nouveaux textes,
            mais pas les nouvelles news. Enfin, il devrait être impossible pour tout le monde (y
            compris les administrateurs) d'archiver un contenu qui n'aurait une durée de vie que de
            1 ou 2 jours.
        </para>

        <para>
            En premier lieu, nous modifions le registre des rôles pour refléter ces
            changements. Nous avons dit que le groupe "Marketing" a les même permissions de base
            que "Staff". Donc nous créons "marketing" pour qu'il hérite des permissions de
            "staff".
        </para>

        <programlisting language="php"><![CDATA[
// Le nouveau groupe Marketing hérite des permissions de Staff
$acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
]]></programlisting>

        <para>
            Ensuite, notez que les contrôles d'accès plus haut font référence à des
            ressources (ex. "newsletters", "dernières news", "annonces"). Maintenant, nous ajoutons
            ces Ressources&#160;:
        </para>

        <programlisting language="php"><![CDATA[
// Créer les Ressources pour les règles

// newsletter
$acl->add(new Zend_Acl_Resource('newsletter'));

// news
$acl->add(new Zend_Acl_Resource('news'));

// dernières news
$acl->add(new Zend_Acl_Resource('latest'), 'news');

// annonces
$acl->add(new Zend_Acl_Resource('announcement'), 'news');
]]></programlisting>

        <para>
            Ensuite c'est simplement une manière de définir ces règles spécifiques sur les
            parties cibles de l'<acronym>ACL</acronym>&#160;:
        </para>

        <programlisting language="php"><![CDATA[
// Le Marketing doit être capable de publier
// et d'archiver les newsletters et les dernières news
$acl->allow('marketing',
            array('newsletter', 'latest'),
            array('publish', 'archive'));

// Staff (et marketing, par héritage),
// n'ont pas la permission de relire les dernières news
$acl->deny('staff', 'latest', 'relire');

// Personne (y compris les administrateurs)
// n'a la permission d'archiver des annonces
$acl->deny(null, 'annonce', 'archive');
]]></programlisting>

        <para>
            On peut maintenant interroger les <acronym>ACL</acronym> sur base des dernières
            modifications&#160;:
        </para>

        <programlisting language="php"><![CDATA[
echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
     "autorisé" : "refusé"; // refusé

echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
     "autorisé" : "refusé"; // autorisé

echo $acl->isAllowed('staff', 'latest', 'publish') ?
     "autorisé" : "refusé"; // refusé

echo $acl->isAllowed('marketing', 'latest', 'publish') ?
     "autorisé" : "refusé"; // autorisé

echo $acl->isAllowed('marketing', 'latest', 'archive') ?
     "autorisé" : "refusé"; // autorisé

echo $acl->isAllowed('marketing', 'latest', 'revise') ?
     "autorisé" : "refusé"; // refusé

echo $acl->isAllowed('editor', 'announcement', 'archive') ?
     "autorisé" : "refusé"; // refusé

echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
     "autorisé" : "refusé"; // refusé
]]></programlisting>
    </sect2>

    <sect2 id="zend.acl.refining.removing">
        <title>Retirer les Contrôles d'Accès</title>

        <para>
            Pour retirer une ou plusieurs règles des <acronym>ACL</acronym>, utilisez simplement la
            méthode <methodname>removeAllow()</methodname> ou <methodname>removeDeny()</methodname>.
            Comme pour <methodname>allow()</methodname> et <methodname>deny()</methodname>, vous
            pouvez utiliser une valeur <constant>NULL</constant> pour indiquer que la méthode
            s'applique à tous les rôles, ressources et&#160;/&#160;ou privilèges.
        </para>

        <programlisting language="php"><![CDATA[
// Retire l'interdiction de relire les dernières news au Staff
// (et au marketing, par héritage)
$acl->removeDeny('staff', 'latest', 'relire');

echo $acl->isAllowed('marketing', 'latest', 'relire') ?
     "autorisé" : "refusé"; // autorisé

// Retire l'autorisation de publier
// et archiver les newsletters au Marketing
$acl->removeAllow('marketing',
                  'newsletter',
                  array('publish', 'archive'));

echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
     "autorisé" : "refusé"; // refusé

echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
     "autorisé" : "refusé"; // refusé
]]></programlisting>

        <para>
            Les privilèges peuvent être modifiés de manière incrémentielle comme indiqué au
            dessus, mais une valeur <constant>NULL</constant> pour les privilèges écrase ces
            modifications incrémentielles.
        </para>

        <programlisting language="php"><![CDATA[
// donne au groupe Marketing toutes les permissions
// sur les dernières nouvelles
$acl->allow('marketing', 'latest');

echo $acl->isAllowed('marketing', 'latest', 'publish') ?
     "autorisé" : "refusé"; // autorisé

echo $acl->isAllowed('marketing', 'latest', 'archive') ?
     "autorisé" : "refusé"; // autorisé

echo $acl->isAllowed('marketing', 'latest', 'anything') ?
     "autorisé" : "refusé"; // autorisé
]]></programlisting>
    </sect2>
</sect1>
