<?xml version="1.0" encoding="UTF-8"?>
    <!-- EN-Revision: 24249 -->
    <!-- Reviewed: no -->
<sect1 id="zend.acl.refining">

    <title>Perfeccionamiento de los controles de acceso</title>

    <sect2 id="zend.acl.refining.precise">

        <title>Definir mejor los controles de acceso</title>

        <para>
            El
            <acronym>ACL</acronym>
            básico según lo definido en la
            <link linkend="zend.acl.introduction"> sección anterior </link>
            demuestra cómo los diversos privilegios se pueden otorgar sobre todo
            el
            <acronym>ACL</acronym>
            (todos los recursos). En la práctica, sin
            embargo, los controles de acceso tienden a
            tener excepciones y
            diversos grados de complejidad.
            <classname>Zend_Acl</classname>
            permite lograr estos refinamientos de una manera sencilla y
            flexible.
        </para>

        <para>
            Para el
            <acronym>CMS</acronym>
            del ejemplo se ha determinado que,
            si bien el grupo 'staff' cubre las necesidades de la
            gran mayoría de
            usuarios, hay una necesidad de un nuevo grupo 'marketing' que
            requiere el
            acceso al boletín de noticias y las últimas noticias en
            el <acronym>CMS</acronym>. El grupo es bastante auto
            suficiente y tendrá la capacidad
            de publicar y de archivar los boletines de noticias y
            las últimas
            noticias.
        </para>

        <para>Primero revisamos el registro del rol para reflejar estos
            cambios. Hemos determinado
            que el grupo 'marketing' tiene los mismos
            permisos básicos que 'staff', así que definimos
            'marketing' de tal
            manera que herede los permisos de 'staff':</para>

        <programlisting language="php"><![CDATA[
 // El nuevo grupo de Marketing hereda los permisos de Staff
 $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
]]></programlisting>

        <para>A continuación, la nota que por encima de los controles de acceso
            se refieren a
            recursos específicos (por ejemplo, "boletín
            informativo", "últimas noticias", "anuncio de
            noticias"). Ahora
            añadimos estos recursos:</para>

        <programlisting language="php"><![CDATA[
// Crear recursos para las reglas
 // newsletter
 $acl->addResource(new Zend_Acl_Resource('newsletter'));

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

 // Últimas Noticias
$acl->addResource(new Zend_Acl_Resource('latest'), 'news');

 // anuncio de noticias
$acl->addResource(new Zend_Acl_Resource('announcement'), 'news');
]]></programlisting>

        <para>
            Entonces es simplemente una cuestión de la definición de estas
            normas más específicas en
            ámbitos de la
            <acronym>ACL</acronym>
            :
        </para>

        <programlisting language="php"><![CDATA[
 //
 Marketing debe ser capaz de archivar y publicar boletines informativos y
 // las últimas noticias
 $acl->allow('marketing',
 array('newsletter', 'latest'),
 array('publish', 'archive'));

 // Staff (y marketing, por herencia), se le denega el permiso a
 // revisar las últimas noticias
 $acl->deny('staff', 'latest', 'revise');

 // Todos (incluyendo los administradores) tienen permiso denegado para
 // archivar anuncios y noticias
 $acl->deny(null, 'announcement', 'archive');
]]></programlisting>

        <para>
            Ahora podemos consultar el
            <acronym>ACL</acronym>
            con respecto a
            los últimos cambios:
        </para>

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

 echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
 "allowed" : "denied";
 // permitido

 echo $acl->isAllowed('staff', 'latest', 'publish') ?
 "allowed" : "denied";
 // denegado

 echo $acl->isAllowed('marketing', 'latest', 'publish') ?
 "allowed" : "denied";
 // permitido

 echo $acl->isAllowed('marketing', 'latest', 'archive') ?
 "allowed" : "denied";
 // permitido

 echo $acl->isAllowed('marketing', 'latest', 'revise') ?
 "allowed" : "denied";
 // denegado

 echo $acl->isAllowed('editor', 'announcement', 'archive') ?
 "allowed" : "denied";
 // denegado

 echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
 "allowed" : "denied";
 // denegado

]]></programlisting>

    </sect2>

    <sect2 id="zend.acl.refining.removing">

        <title>Eliminar los controles de acceso</title>

        <para>
            Para eliminar una o más reglas
            <acronym>ACL</acronym>
            ,
            simplemente utilice el método
            <methodname>removeAllow()</methodname>
            o
            <methodname>removeDeny()</methodname>
            . Al igual que con
            <methodname>allow()</methodname>
            y
            <methodname>deny()</methodname>
            , puede utilizar un valor
            <constant>NULL</constant>
            para indicar que el método es
            aplicable a todos los roles, recursos y/o privilegios:
        </para>

        <programlisting language="php"><![CDATA[
// Elimina la prohibición de leer las últimas noticias de staff (y marketing,
// por herencia)
$acl->removeDeny('staff', 'latest', 'revise');

echo $acl->isAllowed('marketing', 'latest', 'revise') ?
 "allowed" : "denied";
// permitido

// Elimina la autorización para publicar y archivar los boletines
// marketing
$acl->removeAllow('marketing',
                  'newsletter',
                  array('publish', 'archive'));

echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
     "allowed" : "denied";
// denegado

echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
"allowed" : "denied";

// denegado

]]></programlisting>

        <para>
            Los privilegios pueden ser modificados de manera incremental como
            se ha indicado
            anteriormente, pero un valor
            <constant>NULL</constant>
            para los privilegios anula tales
            cambios incrementales:
        </para>

        <programlisting language="php"><![CDATA[
//Permitir al grupo de "marketing" todos los permisos a las últimas noticias
$acl->allow('marketing', 'latest');

echo $acl->isAllowed('marketing', 'latest', 'publish') ?
"allowed" : "denied";
//permitido

echo $acl->isAllowed('marketing', 'latest', 'archive') ?
"allowed" : "denied";
//permitido

echo $acl->isAllowed('marketing', 'latest', 'anything') ?
"allowed" : "denied";
// permitido
]]></programlisting>

    </sect2>

</sect1>
