Zend_Acl.xml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 18729 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.acl.introduction">
  5. <title>Introducción</title>
  6. <para>
  7. <classname>Zend_Acl</classname> provee la implementación de un sistema
  8. simple y flexible de Listas de Control de Acceso
  9. (<acronym>ACL</acronym>, por sus siglas en inglés) para la
  10. administración de privilegios. En general, una aplicación puede utilizar
  11. las <acronym>ACL</acronym> para controlar el acceso a ciertos objetos
  12. protegidos, que son requeridos por otros objetos. </para>
  13. <para> Para los propósitos de esta documentación: <itemizedlist>
  14. <listitem>
  15. <para> Un <emphasis>recurso</emphasis> es un objeto al cual el
  16. acceso esta controlado. </para>
  17. </listitem>
  18. <listitem>
  19. <para> Un <emphasis>rol</emphasis> es un objeto que puede
  20. solicitar acceso a un recurso. </para>
  21. </listitem>
  22. </itemizedlist> En términos generales, <emphasis> Los roles solicitan
  23. acceso a los recursos </emphasis> . Por ejemplo, si una persona
  24. solicita acceso a un automóvil, entonces la persona se convierte en el
  25. rol solicitante, y el automóvil en el recurso, puesto que el acceso al
  26. automóvil puede no estar disponible a cualquiera. </para>
  27. <para> A través de la especificación y uso de Listas de Control de Acceso
  28. (<acronym>ACL</acronym>), una aplicación puede controlar cómo los
  29. objetos solicitantes (roles) han obtenido acceso a objetos protegidos
  30. (recursos). </para>
  31. <sect2 id="zend.acl.introduction.resources">
  32. <title>Acerca de los Recursos</title>
  33. <para> En <classname>Zend_Acl</classname>, crear un recurso es muy
  34. sencillo. <classname>Zend_Acl</classname> proporciona el
  35. <classname>Zend_Acl_Resource_Interface</classname> para
  36. facilitar a los desarrolladores la creación de recursos. Una clase
  37. solo necesita implementar su interfaz, la cual consiste en un método
  38. único, <methodname>getResourceId()</methodname> , para que
  39. <classname>Zend_Acl</classname> considere el objeto como un
  40. recurso. Adicionalmente, <classname>Zend_Acl_Resource</classname> es
  41. proporcionado por <classname>Zend_Acl</classname> como un recurso
  42. básico de aplicación para que los desarrolladores puedan extenderla
  43. hasta donde lo deseen. </para>
  44. <para>
  45. <classname>Zend_Acl</classname> provee un estructura de árbol a la
  46. cual pueden ser agregados múltiples recursos (o "Áreas con Controles
  47. de Acceso").Ya que los recursos son almacenados en esta estructura
  48. de árbol, estos pueden ser organizados desde lo general (hacia la
  49. raíz del árbol) a lo específico (hacia las ramas del árbol).
  50. Consultas sobre un recurso específico buscarán automáticamente, en
  51. la jerarquía del recurso, reglas asignadas a recursos anteriores a
  52. los que el recurso actual haga referencia, permitiendo la herencia
  53. simple de reglas. Por ejemplo, si una regla por defecto se aplica a
  54. cada edificio en una ciudad, uno simplemente podría asignar la regla
  55. a la ciudad, en lugar de asignar la misma regla a cada edificio.
  56. Algunos edificios pueden necesitar excepciones a la regla, sin
  57. embargo, y esto es fácil de hacer en <classname>Zend_Acl</classname>
  58. asignando esta excepción a cada edificio que necesite una excepción
  59. a la regla. Un recurso sólo puede heredar de un recurso padre,
  60. aunque este recurso padre puede tener a la vez su propio recurso
  61. padre, y así; sucesivamente. </para>
  62. <para>
  63. <classname>Zend_Acl</classname> también soporta privilegios sobre
  64. recursos (ejemplo. "crear","leer","actualizar", "borrar"), y el
  65. desarrollador puede asignar reglas que afecten o a todos los
  66. privilegios o a privilegios específicos sobre un recurso. </para>
  67. </sect2>
  68. <sect2 id="zend.acl.introduction.roles">
  69. <title>Acerca de las Reglas</title>
  70. <para> Al igual que los recursos, la creación de un rol también es muy
  71. simple. <classname>Zend_Acl</classname> proporciona
  72. <classname>Zend_Acl_Role_Interface</classname> para facilitar a
  73. los desarrolladores la creación de roles. Una clase solo necesita la
  74. implementación de su interfaz, la cual consiste en un método único,
  75. <methodname>getRoleId()</methodname> , para que
  76. <classname>Zend_Acl</classname> considere que el objeto es un
  77. Rol. Adicionalmente, <classname>Zend_Acl_Role</classname> está
  78. incluido con <classname>Zend_Acl</classname> como una implementación
  79. principal del rol para que los desarrolladores la extiendan hasta
  80. donde lo deseen. </para>
  81. <para> En <classname>Zend_Acl</classname>, un Rol puede heredar de otro
  82. o más roles. Esto es para soportar herencia de reglas entre roles.
  83. Por ejemplo, un Rol de usuario, como "sally", puede estar bajo uno o
  84. más roles padre, como "editor" y "administrador". El desarrollador
  85. puede asignar reglas a "editor" y "administrador" por separado, y
  86. "sally" puede heredar tales reglas de ambos, sin tener que asignar
  87. reglas directamente a "sally". </para>
  88. <para> Dado que la habilidad de herencia desde múltiples roles es muy
  89. útil, múltiples herencias también introduce cierto grado de
  90. complejidad. El siguiente ejemplo ilustra la condición de ambiguedad
  91. y como <classname>Zend_Acl</classname> soluciona esto. </para>
  92. <example id="zend.acl.introduction.roles.example.multiple_inheritance">
  93. <title>Herencia Múlltiple entre Roles</title>
  94. <para> El siguiente código define tres roles principales -
  95. "invitado", "miembro", y "admin" - de los cuales otros roles
  96. pueden heredar. Entonces, un rol identificado como "unUsuario"
  97. es colocado y hereda de los otros tres roles. El orden en el
  98. cual estos roles aparecen en el array
  99. <varname>$parents</varname> es importante. Cuando es
  100. necesario, <classname>Zend_Acl</classname> busca por reglas de
  101. acceso definidas no solo para el rol solicitado (aquí,
  102. "unUsuario"), sino también sobre los roles heredados (aquí,
  103. "invitado", "miembro", y "admin"): </para>
  104. <programlisting language="php"><![CDATA[
  105. require_once 'Zend/Acl.php';
  106. $acl = new Zend_Acl();
  107. require_once 'Zend/Acl/Role.php';
  108. $acl->addRole(new Zend_Acl_Role('invitado'))
  109. ->addRole(new Zend_Acl_Role('miembro'))
  110. ->addRole(new Zend_Acl_Role('admin'));
  111. $parents = array('invitado', 'miembro', 'admin');
  112. $acl->addRole(new Zend_Acl_Role('unUsuario'), $parents);
  113. require_once 'Zend/Acl/Resource.php';
  114. $acl->add(new Zend_Acl_Resource('unRecurso'));
  115. $acl->deny('invitado', 'unRecurso');
  116. $acl->allow('miembro', 'unRecurso');
  117. echo $acl->isAllowed('unUsuario', 'unRecurso') ? 'permitido' : 'denegado';
  118. ]]></programlisting>
  119. <para> Ya que no hay reglas específicamente definidas para el rol
  120. "unUsuario" y "unRecurso", <classname>Zend_Acl</classname> debe
  121. buscar por reglas que puedan estar definidas para roles
  122. "unUsuario" hereda. Primero, el rol "admin" es visitado, y no
  123. hay regla de acceso definida para éste. Luego, el rol "miembro"
  124. es visitado, y <classname>Zend_Acl</classname> encuentra que
  125. aquí hay una regla especificando que "miembro" tiene permiso
  126. para acceder a "unRecurso". </para>
  127. <para> Así, <classname>Zend_Acl</classname> va a seguir examinando
  128. las reglas definidas para otros roles padre, sin embargo,
  129. encontraría que "invitado" tiene el acceso denegado a
  130. "unRecurso". Este hecho introduce una ambigüedad debido a que
  131. ahora "unUsuario" está tanto denegado como permitido para
  132. acceder a "unRecurso", por la razón de tener un conflicto de
  133. reglas heredadas de diferentes roles padre. </para>
  134. <para>
  135. <classname>Zend_Acl</classname> resuelve esta ambigüedad
  136. completando la consulta cuando encuentra la primera regla que es
  137. directamente aplicable a la consulta. En este caso, dado que el
  138. rol "miembro" es examinado antes que el rol "invitado", el
  139. código de ejemplo mostraría "permitido". </para>
  140. </example>
  141. <note>
  142. <para> Cuando se especifican múltiples padres para un Rol, se debe
  143. tener en cuenta que el último padre listado es el primero en ser
  144. buscado por reglas aplicables para una solicitud de
  145. autorización. </para>
  146. </note>
  147. </sect2>
  148. <sect2 id="zend.acl.introduction.creating">
  149. <title>Creando las Listas de Control de Acceso
  150. (<acronym>ACL</acronym>)</title>
  151. <para> Una <acronym>ACL</acronym> puede representar cualquier grupo de
  152. objetos físicos o virtuales que desee. Para propósitos de
  153. demostración, sin embargo, crearemos un <acronym>ACL</acronym>
  154. básico para un Sistema de Administración de Contenido
  155. (<acronym>CMS</acronym>) que mantendrá varias escalas de grupos
  156. sobre una amplia variedad de áreas. Para crear un nuevo objeto
  157. <acronym>ACL</acronym>, iniciamos la <acronym>ACL</acronym> sin
  158. parámetros: </para>
  159. <programlisting language="php"><![CDATA[
  160. require_once 'Zend/Acl.php';
  161. $acl = new Zend_Acl();
  162. ]]></programlisting>
  163. <note>
  164. <para> Hasta que un desarrollador especifique una regla"permitido",
  165. <classname>Zend_Acl</classname> deniega el acceso a cada
  166. privilegio sobre cada recurso para cada rol. </para>
  167. </note>
  168. </sect2>
  169. <sect2 id="zend.acl.introduction.role_registry">
  170. <title>Registrando Roles</title>
  171. <para> El Sistema de Administración de Contenido
  172. (<acronym>CMS</acronym>) casi siempre necesita una jerarquía de
  173. permisos para determinar la capacidad de identificación de sus
  174. usuarios. Puede haber un grupo de 'Invitados' para permitir acceso
  175. limitado para demostraciones, un grupo de 'Personal' para la mayoría
  176. de usuarios del CMS quienes realizan la mayor parte de operaciones
  177. del día a día, un grupo 'Editores' para las responsabilidades de
  178. publicación, revisión, archivo y eliminación de contenido, y
  179. finalmente un grupo 'Administradores' cuyas tareas pueden incluir
  180. todas las de los otros grupos y también el mantenimiento de la
  181. información delicada, manejo de usuarios, configuración de los datos
  182. básicos y su respaldo/exportación. Este grupo de permisos pueden ser
  183. representados en un registro de roles, permitiendo a cada grupo
  184. heredar los privilegios de los grupos 'padre', al igual que
  185. proporcionando distintos privilegios solo para su grupo individual.
  186. Los permisos pueden ser expresados como: </para>
  187. <table
  188. id="zend.acl.introduction.role_registry.table.example_cms_access_controls">
  189. <title>Controles de Acceso para un CMS de ejemplo</title>
  190. <tgroup cols="3">
  191. <thead>
  192. <row>
  193. <entry>Nombre</entry>
  194. <entry>Permisos Individuales</entry>
  195. <entry>Hereda permisos de</entry>
  196. </row>
  197. </thead>
  198. <tbody>
  199. <row>
  200. <entry>Invitado</entry>
  201. <entry>View</entry>
  202. <entry>N/A</entry>
  203. </row>
  204. <row>
  205. <entry>Personal</entry>
  206. <entry>Editar, Enviar, Revisar</entry>
  207. <entry>Invitado</entry>
  208. </row>
  209. <row>
  210. <entry>Editor</entry>
  211. <entry>Publicar, Archivar, Eliminar</entry>
  212. <entry>Personal</entry>
  213. </row>
  214. <row>
  215. <entry>Administrador</entry>
  216. <entry>(Todos los accesos permitidos)</entry>
  217. <entry>N/A</entry>
  218. </row>
  219. </tbody>
  220. </tgroup>
  221. </table>
  222. <para> Para este ejemplo, se usa <classname>Zend_Acl_Role</classname> ,
  223. pero cualquier objeto que implemente
  224. <classname>Zend_Acl_Role_Interface</classname> es admisible.
  225. Estos grupos pueden ser agregados al registro de roles de la
  226. siguiente manera: </para>
  227. <programlisting language="php"><![CDATA[
  228. require_once 'Zend/Acl.php';
  229. $acl = new Zend_Acl();
  230. // Agregar grupos al registro de roles usando <classname>Zend_Acl</classname>_Role
  231. require_once 'Zend/Acl/Role.php';
  232. // Invitado no hereda controles de acceso
  233. $rolInvitado = new Zend_Acl_Role('invitado');
  234. $acl->addRole($rolInvitado);
  235. // Personal hereda de Invitado
  236. $acl->addRole(new Zend_Acl_Role('personal'), $rolInvitado);
  237. /* alternativamente, lo de arriba puede ser escrito así:
  238. $rolInvitado = $acl->addRole(new Zend_Acl_Role('personal'), 'invitado');
  239. //*/
  240. // Editor hereda desde personal
  241. $acl->addRole(new Zend_Acl_Role('editor'), 'personal');
  242. // Administrador no hereda controles de acceso
  243. $acl->addRole(new Zend_Acl_Role('administrador'));
  244. ]]></programlisting>
  245. </sect2>
  246. <sect2 id="zend.acl.introduction.defining">
  247. <title>Definiendo Controles de Acceso</title>
  248. <para> Ahora que la <acronym>ACL</acronym> contiene los roles
  249. relevantes, se pueden establecer reglas que definan cómo los roles
  250. pueden acceder a los recursos. Tenga en cuenta que no definiremos
  251. ningún recurso en particular para este ejemplo, el cual está
  252. simplificado para ilustrar que las reglas se aplican a todos los
  253. recursos. <classname>Zend_Acl</classname> proporciona una forma
  254. práctica por la cual las reglas solo necesitan ser asignadas de lo
  255. general a lo especifico, minimizando el número de reglas necesarias,
  256. porque los recursos y roles heredan reglas que están definidas en
  257. sus padres. </para>
  258. <para> Consecuentemente, podemos definir un grupo razonablemente
  259. complejo de reglas con un mínimo de código. Para aplicar estos
  260. permisos básicos como están definidos arriba: </para>
  261. <programlisting language="php"><![CDATA[
  262. require_once 'Zend/Acl.php';
  263. $acl = new Zend_Acl();
  264. require_once 'Zend/Acl/Role.php';
  265. $rolInvitado = new Zend_Acl_Role('invitado');
  266. $acl->addRole($rolInvitado);
  267. $acl->addRole(new Zend_Acl_Role('personal'), $rolInvitado);
  268. $acl->addRole(new Zend_Acl_Role('editor'), 'personal');
  269. $acl->addRole(new Zend_Acl_Role('administrador'));
  270. // Invitado solo puede ver el contenido
  271. $acl->allow($rolInvitado, null, 'ver');
  272. /* Lo de arriba puede ser escrito de la siguiente forma alternativa:
  273. $acl->allow('invitado', null, 'ver');
  274. //*/
  275. // Personal hereda el privilegio de ver de invitado, pero también necesita privilegios adicionales
  276. $acl->allow('personal', null, array('editar', 'enviar', 'revisar'));
  277. // Editor hereda los privilegios de ver, editar, enviar, y revisar de personal,
  278. // pero también necesita privilegios adicionales
  279. $acl->allow('editor', null, array('publicar', 'archivar', 'eliminar'));
  280. // Administrador no hereda nada, pero tiene todos los privilegios permitidos
  281. $acl->allow('administrador');
  282. ]]></programlisting>
  283. <para> El valor <constant>NULL</constant> en las llamadas de
  284. <methodname>allow()</methodname> es usado para indicar que las
  285. reglas de permiso se aplican a todos los recursos. </para>
  286. </sect2>
  287. <sect2 id="zend.acl.introduction.querying">
  288. <title>Consultando la ACL</title>
  289. <para> Ahora tenemos una <acronym>ACL</acronym> flexible que puede ser
  290. usada para determinar qué solicitantes tienen permisos para realizar
  291. funciones a través de la aplicación web. Ejecutar consultas es la
  292. forma más simple de usar el método
  293. <methodname>isAllowed()</methodname> : </para>
  294. <programlisting language="php"><![CDATA[
  295. echo $acl->isAllowed('invitado', null, 'ver') ?
  296. "permitido" : "denegado"; // permitido
  297. echo $acl->isAllowed('personal', null, 'publicar') ?
  298. "permitido" : "denegado"; // denegado
  299. echo $acl->isAllowed('personal', null, 'revisar') ?
  300. "permitido" : "denegado"; // permitido
  301. echo $acl->isAllowed('editor', null, 'ver') ?
  302. "permitido" : "denegado";
  303. // permitido debido a la herencia de invitado
  304. echo $acl->isAllowed('editor', null, 'actualizar') ?
  305. "permitido" : "denegado";
  306. // denegado debido a que no hay regla de permiso para 'actualizar'
  307. echo $acl->isAllowed('administrador', null, 'ver') ?
  308. "permitido" : "denegado";
  309. // permitido porque administrador tiene permitidos todos los privilegios
  310. echo $acl->isAllowed('administrador') ?
  311. "permitido" : "denegado";
  312. // permitido porque administrador tiene permitidos todos los privilegios
  313. echo $acl->isAllowed('administrador', null, 'actualizar') ?
  314. "permitido" : "denegado";
  315. // permitido porque administrador tiene permitidos todos los privilegios
  316. ]]></programlisting>
  317. </sect2>
  318. </sect1>