Zend_Acl.xml 18 KB

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