Zend_Acl-Advanced.xml 5.1 KB

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