Zend_Acl-Refining.xml 5.9 KB

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