Zend_Acl-Refining.xml 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15783 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.acl.refining">
  5. <title>Perfeccionamiento de los controles de acceso</title>
  6. <sect2 id="zend.acl.refining.precise">
  7. <title>Definir mejor los controles de acceso</title>
  8. <para>
  9. El <acronym>ACL</acronym> básico según lo definido en la
  10. <link linkend="zend.acl.introduction">
  11. sección anterior
  12. </link>
  13. demuestra cómo los diversos privilegios se pueden otorgar
  14. sobre todo el <acronym>ACL</acronym> (todos los recursos). En la práctica, sin
  15. embargo, los controles de acceso tienden a tener excepciones
  16. y diversos grados de complejidad. <classname>Zend_Acl</classname> permite lograr
  17. estos refinamientos de una manera sencilla y flexible.
  18. </para>
  19. <para>
  20. Para el <acronym>CMS</acronym> del ejemplo se ha determinado que, si bien el
  21. grupo 'staff' cubre las necesidades de la gran mayoría de
  22. usuarios, hay una necesidad de un nuevo grupo 'marketing'
  23. que requiere el acceso al boletín de noticias y las últimas
  24. noticias en el CMS. El grupo es bastante auto suficiente y
  25. tendrá la capacidad de publicar y de archivar los boletines
  26. de noticias y las últimas noticias.
  27. </para>
  28. <para>
  29. Primero revisamos el registro del rol para reflejar estos
  30. cambios. Hemos determinado que el grupo 'marketing' tiene
  31. los mismos permisos básicos que 'staff', así que definimos
  32. 'marketing' de tal manera que herede los permisos de
  33. 'staff':
  34. </para>
  35. <programlisting language="php"><![CDATA[
  36. // El nuevo grupo de Marketing hereda los permisos de Staff
  37. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  38. ]]></programlisting>
  39. <para>
  40. A continuación, la nota que por encima de los controles de
  41. acceso se refieren a recursos específicos (por ejemplo,
  42. "boletín informativo", "últimas noticias", "anuncio de
  43. noticias"). Ahora añadimos estos recursos:
  44. </para>
  45. <programlisting language="php"><![CDATA[
  46. // Crear recursos para las reglas
  47. // newsletter
  48. $acl->add(new Zend_Acl_Resource('newsletter'));
  49. // news
  50. $acl->add(new Zend_Acl_Resource('news'));
  51. // Últimas Noticias
  52. $acl->add(new Zend_Acl_Resource('latest'), 'news');
  53. // anuncio de noticias
  54. $acl->add(new Zend_Acl_Resource('announcement'), 'news');
  55. ]]></programlisting>
  56. <para>
  57. Entonces es simplemente una cuestión de la definición de
  58. estas normas más específicas en ámbitos de la <acronym>ACL</acronym>:
  59. </para>
  60. <programlisting language="php"><![CDATA[
  61. //
  62. Marketing debe ser capaz de archivar y publicar boletines informativos y
  63. // las últimas noticias
  64. $acl->allow('marketing',
  65. array('newsletter', 'latest'),
  66. array('publish', 'archive'));
  67. // Staff (y marketing, por herencia), se le denega el permiso a
  68. // revisar las últimas noticias
  69. $acl->deny('staff', 'latest', 'revise');
  70. // Todos (incluyendo los administradores) tienen permiso denegado para
  71. // archivar anuncios y noticias
  72. $acl->deny(null, 'announcement', 'archive');
  73. ]]></programlisting>
  74. <para>
  75. Ahora podemos consultar el <acronym>ACL</acronym> con respecto a los últimos
  76. cambios:
  77. </para>
  78. <programlisting language="php"><![CDATA[
  79. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  80. "allowed" : "denied";
  81. // denegado
  82. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  83. "allowed" : "denied";
  84. // permitido
  85. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  86. "allowed" : "denied";
  87. // denegado
  88. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  89. "allowed" : "denied";
  90. // permitido
  91. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  92. "allowed" : "denied";
  93. // permitido
  94. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  95. "allowed" : "denied";
  96. // denegado
  97. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  98. "allowed" : "denied";
  99. // denegado
  100. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  101. "allowed" : "denied";
  102. // denegado
  103. ]]></programlisting>
  104. </sect2>
  105. <sect2 id="zend.acl.refining.removing">
  106. <title>Eliminar los controles de acceso</title>
  107. <para>
  108. Para eliminar una o más reglas <acronym>ACL</acronym>, simplemente utilice el
  109. método <methodname>removeAllow()</methodname> o <methodname>removeDeny()</methodname>. Al igual que con
  110. <methodname>allow()</methodname> y <methodname>deny()</methodname>, puede utilizar un valor <constant>NULL</constant> para indicar
  111. que el método es aplicable a todos los roles, recursos y/o
  112. privilegios:
  113. </para>
  114. <programlisting language="php"><![CDATA[
  115. // Elimina la prohibición de leer las últimas noticias de staff (y marketing,
  116. // por herencia)
  117. $acl->removeDeny('staff', 'latest', 'revise');
  118. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  119. "allowed" : "denied";
  120. // permitido
  121. // Elimina la autorización para publicar y archivar los boletines
  122. // marketing
  123. $acl->removeAllow('marketing',
  124. 'newsletter',
  125. array('publish', 'archive'));
  126. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  127. "allowed" : "denied";
  128. // denegado
  129. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  130. "allowed" : "denied";
  131. // denegado
  132. ]]></programlisting>
  133. <para>
  134. Los privilegios pueden ser modificados de manera incremental como se
  135. ha indicado anteriormente, pero un valor <constant>NULL</constant> para los
  136. privilegios anula tales cambios incrementales:
  137. </para>
  138. <programlisting language="php"><![CDATA[
  139. //Permitir al grupo de "marketing" todos los permisos a las últimas noticias
  140. $acl->allow('marketing', 'latest');
  141. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  142. "allowed" : "denied";
  143. //permitido
  144. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  145. "allowed" : "denied";
  146. //permitido
  147. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  148. "allowed" : "denied";
  149. // permitido
  150. ]]></programlisting>
  151. </sect2>
  152. </sect1>