Zend_Auth.xml 19 KB

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