| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.acl.refining">
- <title>Refinando Controles de Acesso</title>
- <sect2 id="zend.acl.refining.precise">
- <title>Controles de Acesso Precisos</title>
- <para>
- A <acronym>ACL</acronym> básica definida na
- <link linkend="zend.acl.introduction">seção anterior</link> mostra como vários
- privilégios podem ser permitidos em toda a <acronym>ACL</acronym> (todos os recursos).
- Contudo, na prática, controles de acesso tendem a possuir exceções e diversos níveis
- de complexidade. <classname>Zend_Acl</classname> permite a você realizar estas melhorias
- de uma forma simples e flexível.
- </para>
- <para>
- Para o <acronym>CMS</acronym> de exemplo, foi determinado que, embora o grupo 'equipe'
- cubra as necessidades da grande maioria dos usuários, há necessidade de um novo
- grupo 'marketing', que necessita de acesso a newsletter e últimas notícias no
- <acronym>CMS</acronym>. O grupo é quase auto-suficiente e terá a habilidade de publicar
- e arquivar tanto newsletters como últimas notícias.
- </para>
- <para>
- Adicionalmente, também foi solicitado que o grupo 'equipe' tenha acesso liberado para
- visualizar notícias mas não possam revisar as notícias mais recentes. Finalmente, deve
- ser impossível para qualquer um (inclusive adminsitradores) arquivar qualquer notícia
- de 'comunicado', pois eles ficam visíveis por somente 1 ou 2 dias.
- </para>
- <para>
- Primeiro, revisamos o registro de papéis para refletir estas alterações. Determinamos
- que o grupo 'marketing' tem o mesmo conjunto básico de permissões que 'equipe',
- portanto definimos 'marketing' de modo a herdar as permissões de 'equipe':
- </para>
- <programlisting language="php"><![CDATA[
- // O novo grupo 'marketing' herda permissões de 'equipe'
- $acl->addRole(new Zend_Acl_Role('marketing'), 'equipe');
- ]]></programlisting>
- <para>
- Em seguida, note que os controles de acesso acima se referem a recursos específicos
- (ex., "newsletter", "últimas notícias", "comunicados"). Agora vamos adicionar esses
- recursos:
- </para>
- <programlisting language="php"><![CDATA[
- // Create Resources for the rules
- // newsletter
- $acl->addResource(new Zend_Acl_Resource('newsletter'));
- // Notícias
- $acl->addResource(new Zend_Acl_Resource('notícias'));
- // Últimas notícias
- $acl->addResource(new Zend_Acl_Resource('últimas'), 'notícias');
- // Comunicados
- $acl->addResource(new Zend_Acl_Resource('comunicados'), 'notícias');
- ]]></programlisting>
- <para>
- Então é simplesmente uma questão de definição dessas regras mais específicas para as
- áreas da <acronym>ACL</acronym>:
- </para>
- <programlisting language="php"><![CDATA[
- // Marketing deve publicar e arquivar newsletters e últimas notícias
- $acl->allow('marketing',
- array('newsletter', 'últimas'),
- array('publicar', 'arquivar'));
- // 'Equipe' (e 'Marketing', por herança) são negados a revisar últimas
- //notícias
- $acl->deny('equipe', 'últimas', 'revisar');
- // Todos (incluindo administradores) não podem arquivar notícias de comunicados
- $acl->deny(null, 'comunicados', 'arquivar');
- ]]></programlisting>
- <para>
- Agora podemos consultar a <acronym>ACL</acronym>, respeitando as últimas alterações:
- </para>
- <programlisting language="php"><![CDATA[
- echo $acl->isAllowed('equipe', 'newsletter', 'publicar') ?
- "permitido" : "negado";
- // negado
- echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
- "permitido" : "negado";
- // permitido
- echo $acl->isAllowed('equipe', 'últimas', 'publicar') ?
- "permitido" : "negado";
- // negado
- echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
- "permitido" : "negado";
- // permitido
- echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
- "permitido" : "negado";
- // permitido
- echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
- "permitido" : "negado";
- // negado
- echo $acl->isAllowed('editor', 'comunicados', 'arquivar') ?
- "permitido" : "negado";
- // negado
- echo $acl->isAllowed('administrador', 'comunicados', 'arquivar') ?
- "permitido" : "negado";
- // negado
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.acl.refining.removing">
- <title>Removendo Controles de Acesso</title>
- <para>
- Para remover um ou mais regras de acesso da <acronym>ACL</acronym>, simplesmente use os
- métodos disponíveis <methodname>removeAllow()</methodname> ou
- <methodname>removeDeny()</methodname>. Assim como <methodname>allow()</methodname> e
- <methodname>deny()</methodname>, você pode fornecer um valor <constant>NULL</constant>
- para indicar aplicação a todos os papéis, recursos e/ou privilégios:
- </para>
- <programlisting language="php"><![CDATA[
- // Remove a recusa de revisão de últimas notícias para 'equipe' (e marketing,
- // por herança)
- $acl->removeDeny('equipe', 'últimas', 'revisar');
- echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
- "permitido" : "negado";
- // permitido
- // Remove a permissão para publicar e arquivar newsletters para 'marketing'
- $acl->removeAllow('marketing',
- 'newsletter',
- array('publicar', 'arquivar'));
- echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
- "permitido" : "negado";
- // negado
- echo $acl->isAllowed('marketing', 'newsletter', 'arquivar') ?
- "permitido" : "negado";
- // negado
- ]]></programlisting>
- <para>
- Privilégios podem ser modificados incrementalmente, como indicado acima, mas um valor
- <constant>NULL</constant> para privilégios sobrescreve tais mudanças incrementais:
- </para>
- <programlisting language="php"><![CDATA[
- // Concede a 'marketing' todas as permissões sobre 'últimas notícias'
- $acl->allow('marketing', 'últimas');
- echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
- "permitido" : "negado";
- // permitido
- echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
- "permitido" : "negado";
- // permitido
- echo $acl->isAllowed('marketing', 'útlimas', 'qualquer coisa') ?
- "permitido" : "negado";
- // permitido
- ]]></programlisting>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|