Zend_Acl-Advanced.xml 5.1 KB

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