Zend_Acl-Refining.xml 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.acl.refining">
  5. <title>Refinando Controles de Acesso</title>
  6. <sect2 id="zend.acl.refining.precise">
  7. <title>Controles de Acesso Precisos</title>
  8. <para>
  9. A <acronym>ACL</acronym> básica definida na
  10. <link linkend="zend.acl.introduction">seção anterior</link> mostra como vários
  11. privilégios podem ser permitidos em toda a <acronym>ACL</acronym> (todos os recursos).
  12. Contudo, na prática, controles de acesso tendem a possuir exceções e diversos níveis
  13. de complexidade. <classname>Zend_Acl</classname> permite a você realizar estas melhorias
  14. de uma forma simples e flexível.
  15. </para>
  16. <para>
  17. Para o <acronym>CMS</acronym> de exemplo, foi determinado que, embora o grupo 'equipe'
  18. cubra as necessidades da grande maioria dos usuários, há necessidade de um novo
  19. grupo 'marketing', que necessita de acesso a newsletter e últimas notícias no
  20. <acronym>CMS</acronym>. O grupo é quase auto-suficiente e terá a habilidade de publicar
  21. e arquivar tanto newsletters como últimas notícias.
  22. </para>
  23. <para>
  24. Adicionalmente, também foi solicitado que o grupo 'equipe' tenha acesso liberado para
  25. visualizar notícias mas não possam revisar as notícias mais recentes. Finalmente, deve
  26. ser impossível para qualquer um (inclusive adminsitradores) arquivar qualquer notícia
  27. de 'comunicado', pois eles ficam visíveis por somente 1 ou 2 dias.
  28. </para>
  29. <para>
  30. Primeiro, revisamos o registro de papéis para refletir estas alterações. Determinamos
  31. que o grupo 'marketing' tem o mesmo conjunto básico de permissões que 'equipe',
  32. portanto definimos 'marketing' de modo a herdar as permissões de 'equipe':
  33. </para>
  34. <programlisting language="php"><![CDATA[
  35. // O novo grupo 'marketing' herda permissões de 'equipe'
  36. $acl->addRole(new Zend_Acl_Role('marketing'), 'equipe');
  37. ]]></programlisting>
  38. <para>
  39. Em seguida, note que os controles de acesso acima se referem a recursos específicos
  40. (ex., "newsletter", "últimas notícias", "comunicados"). Agora vamos adicionar esses
  41. recursos:
  42. </para>
  43. <programlisting language="php"><![CDATA[
  44. // Create Resources for the rules
  45. // newsletter
  46. $acl->addResource(new Zend_Acl_Resource('newsletter'));
  47. // Notícias
  48. $acl->addResource(new Zend_Acl_Resource('notícias'));
  49. // Últimas notícias
  50. $acl->addResource(new Zend_Acl_Resource('últimas'), 'notícias');
  51. // Comunicados
  52. $acl->addResource(new Zend_Acl_Resource('comunicados'), 'notícias');
  53. ]]></programlisting>
  54. <para>
  55. Então é simplesmente uma questão de definição dessas regras mais específicas para as
  56. áreas da <acronym>ACL</acronym>:
  57. </para>
  58. <programlisting language="php"><![CDATA[
  59. // Marketing deve publicar e arquivar newsletters e últimas notícias
  60. $acl->allow('marketing',
  61. array('newsletter', 'últimas'),
  62. array('publicar', 'arquivar'));
  63. // 'Equipe' (e 'Marketing', por herança) são negados a revisar últimas
  64. //notícias
  65. $acl->deny('equipe', 'últimas', 'revisar');
  66. // Todos (incluindo administradores) não podem arquivar notícias de comunicados
  67. $acl->deny(null, 'comunicados', 'arquivar');
  68. ]]></programlisting>
  69. <para>
  70. Agora podemos consultar a <acronym>ACL</acronym>, respeitando as últimas alterações:
  71. </para>
  72. <programlisting language="php"><![CDATA[
  73. echo $acl->isAllowed('equipe', 'newsletter', 'publicar') ?
  74. "permitido" : "negado";
  75. // negado
  76. echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
  77. "permitido" : "negado";
  78. // permitido
  79. echo $acl->isAllowed('equipe', 'últimas', 'publicar') ?
  80. "permitido" : "negado";
  81. // negado
  82. echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
  83. "permitido" : "negado";
  84. // permitido
  85. echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
  86. "permitido" : "negado";
  87. // permitido
  88. echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
  89. "permitido" : "negado";
  90. // negado
  91. echo $acl->isAllowed('editor', 'comunicados', 'arquivar') ?
  92. "permitido" : "negado";
  93. // negado
  94. echo $acl->isAllowed('administrador', 'comunicados', 'arquivar') ?
  95. "permitido" : "negado";
  96. // negado
  97. ]]></programlisting>
  98. </sect2>
  99. <sect2 id="zend.acl.refining.removing">
  100. <title>Removendo Controles de Acesso</title>
  101. <para>
  102. Para remover um ou mais regras de acesso da <acronym>ACL</acronym>, simplesmente use os
  103. métodos disponíveis <methodname>removeAllow()</methodname> ou
  104. <methodname>removeDeny()</methodname>. Assim como <methodname>allow()</methodname> e
  105. <methodname>deny()</methodname>, você pode fornecer um valor <constant>NULL</constant>
  106. para indicar aplicação a todos os papéis, recursos e/ou privilégios:
  107. </para>
  108. <programlisting language="php"><![CDATA[
  109. // Remove a recusa de revisão de últimas notícias para 'equipe' (e marketing,
  110. // por herança)
  111. $acl->removeDeny('equipe', 'últimas', 'revisar');
  112. echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
  113. "permitido" : "negado";
  114. // permitido
  115. // Remove a permissão para publicar e arquivar newsletters para 'marketing'
  116. $acl->removeAllow('marketing',
  117. 'newsletter',
  118. array('publicar', 'arquivar'));
  119. echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
  120. "permitido" : "negado";
  121. // negado
  122. echo $acl->isAllowed('marketing', 'newsletter', 'arquivar') ?
  123. "permitido" : "negado";
  124. // negado
  125. ]]></programlisting>
  126. <para>
  127. Privilégios podem ser modificados incrementalmente, como indicado acima, mas um valor
  128. <constant>NULL</constant> para privilégios sobrescreve tais mudanças incrementais:
  129. </para>
  130. <programlisting language="php"><![CDATA[
  131. // Concede a 'marketing' todas as permissões sobre 'últimas notícias'
  132. $acl->allow('marketing', 'últimas');
  133. echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
  134. "permitido" : "negado";
  135. // permitido
  136. echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
  137. "permitido" : "negado";
  138. // permitido
  139. echo $acl->isAllowed('marketing', 'útlimas', 'qualquer coisa') ?
  140. "permitido" : "negado";
  141. // permitido
  142. ]]></programlisting>
  143. </sect2>
  144. </sect1>
  145. <!--
  146. vim:se ts=4 sw=4 et:
  147. -->