Zend_Acl-Advanced.xml 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.acl.advanced">
  5. <title>Uso Avanzado</title>
  6. <sect2 id="zend.acl.advanced.storing">
  7. <title>Almacenamiento Permanente de los Datos ACL</title>
  8. <para>
  9. <classname>Zend_Acl</classname>
  10. fue diseñado de tal manera que no requiere ninguna tecnología particular como bases de
  11. datos o un servidor de cache para el almacenamiento de datos
  12. <acronym>ACL</acronym>
  13. . Al poseer una implementación completamente construida en
  14. <acronym>PHP</acronym>
  15. , es posible construir herramientas de administración personalizadas sobre
  16. <classname>Zend_Acl</classname>
  17. con relativa facilidad y
  18. flexibilidad. En muchas situaciones se requiere alguna forma de
  19. mantenimiento
  20. interactivo de una
  21. <acronym>ACL</acronym>
  22. , y
  23. <classname>Zend_Acl</classname>
  24. provee
  25. métodos para configurar, y consultar, los controles de acceso de una aplicación.
  26. </para>
  27. <para>
  28. El almacenamiento de los datos
  29. <acronym>ACL</acronym>
  30. es una tarea que se delega al
  31. desarrollador, puesto que la utilización variará
  32. extensamente en distintas situaciones.
  33. Dado que
  34. <classname>Zend_Acl</classname>
  35. es serializable, los objetos
  36. <acronym>ACL</acronym>
  37. pueden serializarse con la función
  38. <ulink url="http://php.net/serialize">
  39. <methodname>serialize()</methodname>
  40. </ulink>
  41. de
  42. <acronym>PHP</acronym>
  43. , y los resultados pueden ser almacenados donde sea
  44. que el desarrollador lo desee, en un
  45. archivo, base de datos, o mecanismo de cache
  46. </para>
  47. </sect2>
  48. <sect2 id="zend.acl.advanced.assertions">
  49. <title> Escribiendo reglas condicionales ACL con aserciones </title>
  50. <para>
  51. A veces, una regla para permitir o negar una función de acceso a un recurso no debería
  52. ser absoluta sino que depende de varios criterios. Por ejemplo, supóngase que
  53. debe
  54. permitirse cierto
  55. acceso, pero únicamente entre las 8:00am y 5:00pm. Otro ejemplo
  56. sería
  57. negar el acceso debido a una petición que proviene de una dirección IP que se ha
  58. marcado
  59. como una fuente de abusos.
  60. <classname>Zend_Acl</classname>tiene soporte para la
  61. aplicación de normas basadas en cualquier condición que el
  62. desarrollador necesite.</para>
  63. <para>
  64. <classname>Zend_Acl</classname>
  65. provee soporte para reglas condicionales con
  66. <classname>Zend_Acl_Assert_Interface</classname>. Con el fin de utilizar la regla
  67. de aserción de la interfaz, un desarrollador escribe
  68. una clase que implemente el método<methodname>assert()</methodname>
  69. de la interfaz:
  70. </para>
  71. <programlisting language="php"><![CDATA[
  72. class CleanIPAssertion implements Zend_Acl_Assert_Interface
  73. {
  74. public function assert(Zend_Acl $acl,
  75. Zend_Acl_Role_Interface $role = null,
  76. Zend_Acl_Resource_Interface $resource = null,
  77. $privilege = null)
  78. {
  79. return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
  80. }
  81. protected function _isCleanIP($ip)
  82. {
  83. // ...
  84. }
  85. }
  86. ]]></programlisting>
  87. <para>
  88. Una vez la clase de aserción esta disponible, el desarrollador puede suministrar una
  89. instancia de la clase de aserción cuando asigna reglas condicionales. Una regla que es
  90. creada con una
  91. aserción sólo se aplica cuando el método de la aserción devuelve
  92. <constant>TRUE</constant>
  93. .
  94. </para>
  95. <programlisting language="php"><![CDATA[
  96. $acl = new Zend_Acl();
  97. $acl->allow(null, null, null, new CleanIPAssertion());
  98. ]]></programlisting>
  99. <para>El código anterior crea una regla condicional que permite el acceso a todos los
  100. privilegios sobre todo, por todo el mundo, excepto cuando la IP de quien hace la
  101. petición está en la "lista
  102. negra". Si una petición viene desde una IP que no está
  103. considerada "limpia", entonces la regla no se aplica. Dado que la regla se aplica a
  104. todos los roles, todos los recursos, y todos los
  105. privilegios, una IP "no limpia" daría
  106. lugar a una negación de acceso. Éste es un caso especial, sin embargo, y debería ser
  107. entendido que en todos los otros casos (por ejemplo, cuando un rol
  108. específico, recurso, o
  109. privilegio está especificado por la regla), una aserción fallida provoca que la regla
  110. no
  111. se aplique, y otras reglas deberían ser usadas para determinar si el acceso
  112. está
  113. permitido o denegado.</para>
  114. <para>
  115. El método
  116. <methodname>assert()</methodname>
  117. de un objeto aserción es pasado a la
  118. <acronym>ACL</acronym>
  119. , regla, recurso, y privilegio para el cual una consulta de
  120. autorización (por ejemplo,
  121. <methodname>isAllowed()</methodname>
  122. ) se aplica, con el fin de proporcionar un contexto para que la clase de aserción
  123. determine sus condiciones
  124. cuando fuera necesario.
  125. </para>
  126. </sect2>
  127. </sect1>