Zend_Auth.xml 20 KB

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