Zend_Auth.xml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 16652 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.auth.introduction">
  5. <title>Introducción</title>
  6. <para>
  7. <classname>Zend_Auth</classname>
  8. provee una
  9. <acronym>API</acronym>
  10. para
  11. autenticación e incluye adaptadores concretos de autenticación para
  12. escenarios de casos
  13. de uso común.
  14. </para>
  15. <para>
  16. <classname>Zend_Auth</classname>
  17. es concerniente sólo con
  18. <emphasis>autenticación</emphasis>
  19. y no con
  20. <emphasis>autorización</emphasis>
  21. . Autenticación es vagamente
  22. definido como: determinar si una entidad realmente es lo que
  23. pretende
  24. ser (o sea, identificación), basandose en un grupo de credenciales.
  25. Autorización, el
  26. proceso de decidir si se permite a una entidad: acceso
  27. a, o el realizar operaciones en, otras
  28. entidades esta fuera del alcance
  29. de
  30. <classname>Zend_Auth</classname>
  31. . Para más información sobre
  32. autorización y control de acceso con Zend Framework, por favor
  33. vea
  34. <link linkend="zend.acl">Zend_Acl</link>
  35. .
  36. </para>
  37. <note>
  38. <para>
  39. La clase
  40. <classname>Zend_Auth</classname>
  41. implementa el patrón
  42. Singleton - sólo una instancia de la clase está disponible - a
  43. través de su método estático
  44. <methodname>getInstance()</methodname>
  45. . Esto significa que usar el operador
  46. <emphasis>new</emphasis>
  47. y
  48. la keyword
  49. <emphasis>clone</emphasis>
  50. no va a funcionar con la
  51. clase
  52. <classname>Zend_Auth</classname>
  53. : use
  54. <methodname>Zend_Auth::getInstance()</methodname>
  55. en su lugar.
  56. </para>
  57. </note>
  58. <sect2 id="zend.auth.introduction.adapters">
  59. <title>Adaptadores</title>
  60. <para>
  61. Un adaptador
  62. <classname>Zend_Auth</classname>
  63. es usado para
  64. autenticar en contra de un tipo particular de servicio de
  65. autenticación,
  66. como
  67. <acronym>LDAP</acronym>
  68. ,
  69. <acronym>RDBMS</acronym>
  70. , o almacenamiento basado en
  71. ficheros. Diferentes adaptadores pueden tener opciones y
  72. compotamientos muy diferentes, pero algunas cosas básicas son
  73. comunes entre los
  74. adaptadores de autenticación. Por ejemplo, aceptar
  75. credenciales de autenticación
  76. (incluyendo una identidad supuesta),
  77. realizar consultas ante el servicio de
  78. autenticación, y regresar
  79. resultados, son comunes para los adaptadores
  80. <classname>Zend_Auth</classname>
  81. .
  82. </para>
  83. <para>
  84. Cada clase adaptadora
  85. <classname>Zend_Auth</classname>
  86. implementa
  87. <classname>Zend_Auth_Adapter_Interface</classname>
  88. . Esta
  89. interface define un metodo,
  90. <methodname>authenticate()</methodname>
  91. , que la clase adaptadora debe implementar para realizar una
  92. peticion de autenticación.
  93. Cada clase adaptadora debe ser preparada
  94. antes de llamar a
  95. <methodname>authenticate()</methodname>
  96. . Esta
  97. preparación del adaptador incluye la creación de credenciales (p.ej.
  98. nombre de
  99. usuario y contraseña) y la definición de valores para
  100. opciones de configuración
  101. especificos del adaptador, como valores de
  102. coneccion a base de datos para un adaptador de
  103. tabla de base de
  104. datos.
  105. </para>
  106. <para>El siguente ejemplo es un adaptador de autenticación que requiere
  107. que un nombre de
  108. usuario y contraseña sean especificados para la
  109. autenticación. Otros detalles, como la
  110. forma de realizar peticiones
  111. al servicio de autenticación, han sido omitídos por
  112. brevedad:
  113. </para>
  114. <programlisting language="php"><![CDATA[
  115. class MyAuthAdapter implements Zend_Auth_Adapter_Interface
  116. {
  117. /**
  118. * Establece nombre de usuario y contraseña para autenticacón
  119. *
  120. * @return void
  121. */
  122. public function __construct($username, $password)
  123. {
  124. // ...
  125. }
  126. /**
  127. * Realiza un intento de autenticación
  128. *
  129. * @throws Zend_Auth_Adapter_Exception Si la autenticación no puede
  130. * ser realizada
  131. * @return Zend_Auth_Result
  132. */
  133. public function authenticate()
  134. {
  135. // ...
  136. }
  137. }
  138. ]]></programlisting>
  139. <para>
  140. Como se ha indicado en su docblock,
  141. <methodname>authenticate()</methodname>
  142. debe regresar una
  143. instancia de
  144. <classname>Zend_Auth_Result</classname>
  145. (o de una clase
  146. derivada de
  147. <classname>Zend_Auth_Result</classname>
  148. ). Si por alguna
  149. razón es imposible realizar una petición de autenticación,
  150. <methodname>authenticate()</methodname>
  151. debería arrojar una
  152. excepción que se derive de
  153. <classname>Zend_Auth_Adapter_Exception</classname>
  154. .
  155. </para>
  156. </sect2>
  157. <sect2 id="zend.auth.introduction.results">
  158. <title>Resultados</title>
  159. <para>
  160. Los adaptadores
  161. <classname>Zend_Auth</classname>
  162. regresan una instancia de
  163. <classname>Zend_Auth_Result</classname>
  164. con
  165. <methodname>authenticate()</methodname>
  166. para representar el
  167. resultado de un intento de autenticación. Los adaptadores llenan el
  168. objeto
  169. <classname>Zend_Auth_Result</classname>
  170. en cuanto se
  171. construye, así que los siguientes cuatro métodos proveen un grupo
  172. básico de
  173. operaciones "frente al usuario" que son comunes a los
  174. resultados de adaptadores
  175. Zend_Auth:
  176. </para>
  177. <itemizedlist>
  178. <listitem>
  179. <para>
  180. <methodname>isValid()</methodname>
  181. - regresa true si y
  182. solo si el resultado representa un intento de
  183. autenticación exitoso
  184. </para>
  185. </listitem>
  186. <listitem>
  187. <para>
  188. <methodname>getCode()</methodname>
  189. - regresa una
  190. constante identificadora
  191. <classname>Zend_Auth_Result</classname>
  192. para
  193. determinar el tipo de fallo en la autenticación o si ha
  194. sido exitosa.
  195. Este puede ser usado en situaciones cuando
  196. el desarrollador desea distinguir
  197. entre varios tipos de
  198. resultados de autenticación. Esto permite a los
  199. desarrolladores, por ejemplo, mantener estadísticas
  200. detalladas de los
  201. resultados de autenticación. Otro uso
  202. de esta característica es: proporcionar
  203. al usuario
  204. mensajes específicos detallados por razones de
  205. usabilidad, aunque
  206. los desarrolladores son exhortados a
  207. considerar el riesgo de proporcionar
  208. tales detalles a
  209. los usuarios, en vez de un mensaje general de fallo en
  210. la
  211. autenticación. Para más información, vea las
  212. siguientes notas:
  213. </para>
  214. </listitem>
  215. <listitem>
  216. <para>
  217. <methodname>getIdentity()</methodname>
  218. - regresa la
  219. identidad del intento de autenticación
  220. </para>
  221. </listitem>
  222. <listitem>
  223. <para>
  224. <methodname>getMessages()</methodname>
  225. - regresa un
  226. arreglo de mensajes pertinentes a un fallido intento de
  227. autenticación
  228. </para>
  229. </listitem>
  230. </itemizedlist>
  231. <para>El desarrollador podría desear ramificar basado en el tipo de
  232. resultado de la
  233. autenticación a fin de realizar operaciones mas
  234. específicas. Algunas operaciones que los
  235. desarrolladores podrían
  236. encontrar útiles son: bloquear cuentas despues de varios intentos
  237. fallidos de ingresar una contraseña, marcar una dirección IP despues
  238. de que ha intentado
  239. muchas identidades no existentes, y porporcionar
  240. al usuario mensajes especificos
  241. resultados de la autenticación. Los
  242. siguientes codigos de resultado están disponibles:
  243. </para>
  244. <programlisting language="php"><![CDATA[
  245. Zend_Auth_Result::SUCCESS
  246. Zend_Auth_Result::FAILURE
  247. Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND
  248. Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS
  249. Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID
  250. Zend_Auth_Result::FAILURE_UNCATEGORIZED
  251. ]]></programlisting>
  252. <para>El siguiente ejemplo ilustra como un desarrollador podría
  253. ramificar basado en el código
  254. resultado:
  255. </para>
  256. <programlisting language="php"><![CDATA[
  257. // debtri de AuthController / loginAction
  258. $result = $this->_auth->authenticate($adapter);
  259. switch ($result->getCode()) {
  260. case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
  261. /** realiza algo para identidad inexistente **/
  262. break;
  263. case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
  264. /** realiza algo para credencial invalida **/
  265. break;
  266. case Zend_Auth_Result::SUCCESS:
  267. /** realiza algo para autenticación exitosa **/
  268. break;
  269. default:
  270. /** realiza algo para otras fallas **/
  271. break;
  272. }
  273. ]]></programlisting>
  274. </sect2>
  275. <sect2 id="zend.auth.introduction.persistence">
  276. <title>Persistencia de Identidad</title>
  277. <para>Autenticar una petición que incluye credenciales de autenticación
  278. es util por sí mismo,
  279. pero también es importante el soportar
  280. mantener la identidad autenticada sin tener que
  281. presentar las
  282. credenciales de autenticación con cada petición.</para>
  283. <para>
  284. <acronym>HTTP</acronym>
  285. es un protocolo sin estado, sin embargo, se han desarrollado
  286. técnicas como las cookies y
  287. sesiones a fin de facilitar mantener el
  288. estado a través de multiples peticiones en
  289. aplicaciones web del lado
  290. del servidor.
  291. </para>
  292. <sect3 id="zend.auth.introduction.persistence.default">
  293. <title>Persistencia por Defecto en la Sesión PHP</title>
  294. <para>
  295. Por defecto,
  296. <classname>Zend_Auth</classname>
  297. provee
  298. almacenamiento persistente de la identidad desde un intento de
  299. autenticación
  300. exitoso usando la sesión
  301. <acronym>PHP</acronym>
  302. . En un intento de
  303. autenticación exitoso,
  304. <methodname>end_Auth::authenticate()</methodname>
  305. almacena la
  306. identidad del resultado de autenticación en almacenamiento
  307. persistente. A
  308. menos que se configure diferente,
  309. <classname>Zend_Auth</classname>
  310. usa una clase de
  311. almacenamiento llamada
  312. <classname>Zend_Auth_Storage_Session</classname>
  313. , la cual,
  314. a su vez usa
  315. <link linkend="zend.session">
  316. <classname>Zend_Session</classname>
  317. </link>
  318. . Una clase diferente podría ser utilizada mediante
  319. proveer un objeto que implemente
  320. <classname>Zend_Auth_Storage_Interface</classname>
  321. a
  322. <methodname>Zend_Auth::setStorage()</methodname>
  323. </para>
  324. <note>
  325. <para>
  326. Si el automático almacenamiento persistente de la
  327. identidad no es apropiado para
  328. un caso en particular,
  329. entonces los desarrolladores podrían dejar de usar la
  330. clase
  331. <classname>Zend_Auth</classname>
  332. al mismo tiempo,
  333. utilizando en su lugar una clase adaptadora directamente.
  334. </para>
  335. </note>
  336. <example id="zend.auth.introduction.persistence.default.example">
  337. <title>Modifying the Session Namespace</title>
  338. <para>
  339. <classname>Zend_Auth_Storage_Session</classname>
  340. usa un
  341. espacionombre (namespace) de sesión 'Zend_Auth'. Este
  342. espacio-nombre podría
  343. ser OVERRIDDEN al pasar un valor
  344. diferente al contructor de
  345. <classname>Zend_Auth_Storage_Session</classname>
  346. , y
  347. este valor es pasado internamente al constructor de
  348. <classname>Zend_Session_Namespace</classname>
  349. . Esto
  350. debería ocurrir antes de que se intente la autenticación, ya
  351. que
  352. <methodname>Zend_Auth::authenticate()</methodname>
  353. realiza
  354. el almacenamiento automático de la identidad.
  355. </para>
  356. <programlisting language="php"><![CDATA[
  357. // Almacena una referencia a la instancia Singleton de Zend_Auth
  358. $auth = Zend_Auth::getInstance();
  359. // Usa 'unEspacionombre' en lugar de 'Zend_Auth'
  360. $auth->setStorage(new Zend_Auth_Storage_Session('unEspacionombre'));
  361. /**
  362. * @todo Set up the auth adapter, $authAdapter
  363. */
  364. // Autenticar, almacenando el resultado, y persistiendo la identidad en
  365. // suceso
  366. $result = $auth->authenticate($authAdapter);
  367. ]]></programlisting>
  368. </example>
  369. </sect3>
  370. <sect3 id="zend.auth.introduction.persistence.custom">
  371. <title>Implementando Almacenamiento Personalizado</title>
  372. <para>
  373. En ocaciones los desarrolladores podrían necesitar usar un
  374. diferente comportamiento
  375. de persistencia de identidad que el
  376. provisto por
  377. <classname>Zend_Auth_Storage_Session</classname>
  378. .
  379. Para esos casos los desarrolladores podrían simplemente
  380. implementar
  381. <classname>Zend_Auth_Storage_Interface</classname>
  382. y
  383. suplir una instancia de la clase a
  384. <methodname>Zend_Auth::setStorage()</methodname>
  385. .
  386. </para>
  387. <example id="zend.auth.introduction.persistence.custom.example">
  388. <title>Usando una Clase de Almacenamiento Personalizada</title>
  389. <para>
  390. Para poder utilizar una clase de almacenamiento
  391. persistente de identidad
  392. diferente a
  393. <classname>Zend_Auth_Storage_Session</classname>
  394. , el
  395. desarrollador implementa
  396. <classname>Zend_Auth_Storage_Interface</classname>
  397. :
  398. <programlisting language="php"><![CDATA[
  399. class MyStorage implements Zend_Auth_Storage_Interface
  400. {
  401. /**
  402. * Regresa true si y solo si el almacenamiento esta vacio
  403. *
  404. * @arroja Zend_Auth_Storage_Exception Si es imposible
  405. * determinar si el almacenamiento
  406. * esta vacio
  407. * @regresa boleano
  408. */
  409. public function isEmpty()
  410. {
  411. /**
  412. * @por hacer implementación
  413. */
  414. }
  415. /**
  416. * Regresa el contenido del almacenamiento
  417. *
  418. * El comportamiento es indefinido cuando el almacenamiento esta vacio
  419. *
  420. * @arroja Zend_Auth_Storage_Exception Si leer contenido de
  421. * almacenamiento es imposible
  422. * @regresa mixto
  423. */
  424. public function read()
  425. {
  426. /**
  427. * @por hacer implementación
  428. */
  429. }
  430. /**
  431. * Escribe $contents al almacenamiento
  432. *
  433. * @parametros mezclado $contents
  434. * @arroja Zend_Auth_Storage_Exception Si escribir $contents al
  435. * almacenamiento es imposible
  436. * @regresa boleano
  437. */
  438. public function write($contents)
  439. {
  440. /**
  441. * @por hacer implementación
  442. */
  443. }
  444. /**
  445. * limpia contenidos del almacenamiento
  446. *
  447. * @arroja Zend_Auth_Storage_Exception Si limpiar contenidos del
  448. * almacenamiento es imposible
  449. * @regresa void
  450. */
  451. public function clear()
  452. {
  453. /**
  454. * @por hacer implementación
  455. */
  456. }
  457. }
  458. ]]></programlisting>
  459. </para>
  460. <para>
  461. A fin de poder usar esta clase de almacenamiento
  462. personalizada,
  463. <methodname>Zend_Auth::setStorage()</methodname>
  464. es
  465. invocada antes de intentar una petición de autenticación:
  466. </para>
  467. <programlisting language="php"><![CDATA[
  468. // Instruye Zend_Auth para usar la clase de almacenamiento personalizada
  469. Zend_Auth::getInstance()->setStorage(new MyStorage());
  470. /**
  471. * @por hacer Configurar el adaptador de autenticación, $authAdapter
  472. */
  473. // Autenticar, almacenando el resultado, y persistiendo la identidad
  474. // si hay exito
  475. $result = Zend_Auth::getInstance()->authenticate($authAdapter);
  476. ]]></programlisting>
  477. </example>
  478. </sect3>
  479. </sect2>
  480. <sect2 id="zend.auth.introduction.using">
  481. <title>Uso</title>
  482. <para>
  483. Hay dos formas provistas de usar adaptadores
  484. <classname>Zend_Auth</classname>
  485. :
  486. </para>
  487. <orderedlist>
  488. <listitem>
  489. <para>
  490. indirectamente, a través de
  491. <methodname>Zend_Auth::authenticate()</methodname>
  492. </para>
  493. </listitem>
  494. <listitem>
  495. <para>
  496. directamente, a través del metodo
  497. <methodname>authenticate()</methodname>
  498. del
  499. adaptador
  500. </para>
  501. </listitem>
  502. </orderedlist>
  503. <para>
  504. El siguiente ejemplo ilustra como usar el adaptador
  505. <classname>:Zend_Auth</classname>
  506. : indirectamente, a través del
  507. uso de la clase
  508. <classname>Zend_Auth</classname>
  509. :
  510. <programlisting language="php"><![CDATA[
  511. // Recibe una referencia a la instancia singleton de Zend_Auth
  512. $auth = Zend_Auth::getInstance();
  513. // Configura el adaptador de autenticación
  514. $authAdapter = new MyAuthAdapter($username, $password);
  515. // Intenta la autenticación, almacenando el resultado
  516. $result = $auth->authenticate($authAdapter);
  517. if (!$result->isValid()) {
  518. // Fautenticación fallida: imprime el por que
  519. foreach ($result->getMessages() as $message) {
  520. echo "$message\n";
  521. }
  522. } else {
  523. // Autenticación exitosa, la identidad ($username) es almacenada
  524. // en la sesión
  525. // $result->getIdentity() === $auth->getIdentity()
  526. // $result->getIdentity() === $username
  527. }
  528. ]]></programlisting>
  529. </para>
  530. <para>Una vez que la autenticación ha sido intentada en una petición,
  531. como en el ejemplo
  532. anterior, es fácil verificar si existe una
  533. identidad autenticada exitosamente:
  534. </para>
  535. <programlisting language="php"><![CDATA[
  536. $auth = Zend_Auth::getInstance();
  537. if ($auth->hasIdentity()) {
  538. // Existe la identidad; obtenla
  539. $identity = $auth->getIdentity();
  540. }
  541. ]]></programlisting>
  542. <para>
  543. Para remover una identidad del almacenamiento persistente,
  544. simplemente usa el metodo
  545. <methodname>clearIdentity()</methodname>
  546. method. Comunmente esto sería usado para implementar una operación
  547. "cerrar sesión" en la
  548. aplicación:
  549. <programlisting language="php"><![CDATA[
  550. Zend_Auth::getInstance()->clearIdentity();
  551. ]]></programlisting>
  552. </para>
  553. <para>
  554. Cuando el uso automático de almacenamiento persistente es
  555. inapropiado para un caso en
  556. particular, el desarrollador podría
  557. simplemente omitir el uso de la clase
  558. <classname>Zend_Auth</classname>
  559. , usando una clase adaptadora
  560. directamente. El uso directo de una clase adaptadora
  561. implica
  562. configurar y preparar un objeto adaptador y despues llamar a su
  563. metodo
  564. <methodname>authenticate()</methodname>
  565. . Los detalles
  566. específicos del adaptador son discutidos en la documentación de cada
  567. adaptador. El siguiente ejemplo utiliza directamente
  568. <classname>MyAuthAdapter</classname>
  569. :
  570. </para>
  571. <programlisting language="php"><![CDATA[
  572. // Configura el adaptador de autenticación
  573. $authAdapter = new MyAuthAdapter($username, $password);
  574. // Intenta la autenticación, almacenando el resultado
  575. $result = $authAdapter->authenticate();
  576. if (!$result->isValid()) {
  577. // Autenticación fallida, imprime el porque
  578. foreach ($result->getMessages() as $message) {
  579. echo "$message\n";
  580. }
  581. } else {
  582. // Autenticación exitosa
  583. // $result->getIdentity() === $username
  584. }
  585. ]]></programlisting>
  586. </sect2>
  587. </sect1>