Zend_Auth.xml 20 KB

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