Zend_Acl.xml 20 KB

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