Zend_Acl-Advanced.xml 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.acl.advanced">
  5. <title>Uso Avançado</title>
  6. <sect2 id="zend.acl.advanced.storing">
  7. <title>Armazenando ACL para Persistência de Dados</title>
  8. <para>
  9. <classname>Zend_Acl</classname> foi projetado de uma maneira que não requer nenhuma
  10. teconologia de backend em particular, como um banco de dados ou servidor de cache, para
  11. armazenamento de dados <acronym>ACL</acronym>. Sua implementação completamente em
  12. <acronym>PHP</acronym> permite que ferramentas personalizadas de admnistração sejam
  13. construídas sob <classname>Zend_Acl</classname> com relativa facilidade e flexibilidade.
  14. Muitas situações necessitam de alguma forma de manutenção da <acronym>ACL</acronym> e
  15. <classname>Zend_Acl</classname> fornece métodos para estabelecer e consultar os
  16. controles de acesso de uma aplicação.
  17. </para>
  18. <para>
  19. O armazenamento dos dados da <acronym>ACL</acronym> é uma tarefa deixada para o
  20. desenvolvedor, visto que espera-se que os casos de uso possam variar muito de acordo com
  21. situações diversas. Por conta de <classname>Zend_Acl</classname> ser serializável,
  22. objetos <acronym>ACL</acronym> podem ser serializados com a função
  23. <ulink url="http://php.net/serialize"><methodname>serialize()</methodname></ulink> do
  24. <acronym>PHP</acronym> e o resultado pode ser armazenado em qualquer lugar que o
  25. desenvolvedor desejar, como um arquivo, banco de dados ou mecanismo de cache.
  26. </para>
  27. </sect2>
  28. <sect2 id="zend.acl.advanced.assertions">
  29. <title>Escrevendo Regras ACL Condicionais com Asserções</title>
  30. <para>
  31. Algumas vezes uma regra para permitir ou negar acesso de um papel a um recurso não deve
  32. ser absoluta, mas dependente de vários critérios. Por exemplo, suponha que certo acesso
  33. deva ser liberado, mas somente entre o horário entre 8h00 e 17h00. Outro exemplo seria
  34. negar um acesso por conta de uma requisição vinda de um <acronym>IP</acronym> que foi
  35. identificado como fonte de abuso. <classname>Zend_Acl</classname> foi construído para
  36. suportar a implementação de regras baseadas em quaisquer condições que o desenvolvedor
  37. necessitar.
  38. </para>
  39. <para>
  40. <classname>Zend_Acl</classname> fornece suporte para regras condicionais com
  41. <classname>Zend_Acl_Assert_Interface</classname>. Para utilizar a interface de asserção
  42. de regra, o desenvolvedor escreve uma classe que implemente o método
  43. <methodname>assert()</methodname> da interface:
  44. </para>
  45. <programlisting language="php"><![CDATA[
  46. class CleanIPAssertion implements Zend_Acl_Assert_Interface
  47. {
  48. public function assert(Zend_Acl $acl,
  49. Zend_Acl_Role_Interface $role = null,
  50. Zend_Acl_Resource_Interface $resource = null,
  51. $privilege = null)
  52. {
  53. return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
  54. }
  55. protected function _isCleanIP($ip)
  56. {
  57. // ...
  58. }
  59. }
  60. ]]></programlisting>
  61. <para>
  62. Uma vez que uma classe de asserção está disponível, o desenvolvedor deve fornecer uma
  63. instância de classe de asserção ao atribuir regras condicionais. Uma regra criada com
  64. uma asserção somente se aplica quando o método de asserção retorna
  65. <constant>TRUE</constant>.
  66. </para>
  67. <programlisting language="php"><![CDATA[
  68. $acl = new Zend_Acl();
  69. $acl->allow(null, null, null, new CleanIPAssertion());
  70. ]]></programlisting>
  71. <para>
  72. O código acima cria uma regra condicional que permite acesso a todos os priviégios, para
  73. tudo e para todos, exceto quando o <acronym>IP</acronym> solicitante está em uma
  74. "lista negra". Se a requisição vem de um <acronym>IP</acronym> que não é considerado
  75. "confiável" a regra não se aplicará. Um vez que a regra se aplica a todos os papéis,
  76. todos os recursos e todos os privilégios, um <acronym>IP</acronym> "não confiável"
  77. resultará em uma recusa de acesso. Contudo, este é um caso especial, e deve ser
  78. entendido que para todos os outros casos (ex., quando um papel específico, recurso ou
  79. privilégio é especificado para a regra), um asserção falsa resultará na regra não sendo
  80. aplicada, e outras regras serão utilizadas para determinar se o acesso é permitido ou
  81. negado.
  82. </para>
  83. <para>
  84. Ao método <methodname>assert()</methodname> de um objeto de asserção é passada a
  85. <acronym>ACL</acronym>, o papel, recurso e privilégio de que a consulta de autorização
  86. (ex., <methodname>isAllowed()</methodname>) se aplica, a fim de fornecer um contexto
  87. para que a classe de asserção possa determinar se suas condições são necessárias.
  88. </para>
  89. </sect2>
  90. </sect1>
  91. <!--
  92. vim:se ts=4 sw=4 et:
  93. -->