Zend_Acl-Refining.xml 6.5 KB

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