Zend_Auth.xml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.auth.introduction">
  5. <title>Einführung</title>
  6. <para>
  7. <classname>Zend_Auth</classname> bietet eine API für das Authentifizieren und enthält konkrete
  8. Authentifizierungs-Adapter für übliche Use Case Szenarien.
  9. </para>
  10. <para>
  11. <classname>Zend_Auth</classname> behandelt nur die <emphasis role="strong">Authentifizierung</emphasis>
  12. und nicht die <emphasis role="strong">Authorisierung</emphasis>. Authentifizierung ist lose
  13. definiert als das Ermitteln ob eine Entität aktuell das ist was Sie vorgibt zu sein (z.B.
  14. Identifizierung), basierend auf einem Set von Zeugnissen. Authorisierung, der Prozess des
  15. Entscheidens ob es einer Entität erlaubt wird auf andere Entitäten Zugriff zu erhalten,
  16. oder um auf diesen Operationen durchzuführen, ist ausserhalb der Möglichkeit von
  17. <classname>Zend_Auth</classname>. Für weitere Informationen über Authorisierung und Zugriffskontrolle
  18. mit dem Zend Framework, sollte <link linkend="zend.acl"><classname>Zend_Acl</classname></link>
  19. angeschaut werden.
  20. </para>
  21. <note>
  22. <para>
  23. Die <classname>Zend_Auth</classname> Klasse implementiert das Singleton Pattern - nur eine Instanz der
  24. Klasse ist vorhanden - durch Ihre statische <code>getInstance()</code> Methode. Das bedeutet das
  25. die Verwendung des <code>new</code> Operators und des <code>clone</code> Keywords mit der
  26. <classname>Zend_Auth</classname> Klasse nicht funktioniert; stattdessen muß <classname>Zend_Auth::getInstance()</classname>
  27. verwendet werden.
  28. </para>
  29. </note>
  30. <sect2 id="zend.auth.introduction.adapters">
  31. <title>Adapter</title>
  32. <para>
  33. Ein <classname>Zend_Auth</classname> Adapter wird verwendet um sich gegenüber einem speziellen
  34. Typ von Authentifizierungs Services zu authentifizieren, wie LDAP, RDBMS, oder
  35. Datei-basierenden Speichern. Verschiedene Adapter besitzen leicht unterschiedliche
  36. Optionen und Verhaltensweisen, aber einige grundlegende Dinge sind für
  37. Authentifizierungs Adapter üblich. Zum Beispiel das die Authentifizierung Zeugnisse
  38. akzeptiert werden (enthält auch vorgegebene Identitäten), das Abfragen am
  39. Authentifizierungsservice durchgeführt werden, und das Ergebnisse zurückgegeben werden,
  40. sind für <classname>Zend_Auth</classname> Adapter üblich.
  41. </para>
  42. <para>
  43. Jede <classname>Zend_Auth</classname> Adapter Klasse implementiert <classname>Zend_Auth_Adapter_Interface</classname>. Dieses
  44. Interface definiert eine Methode, <code>authenticate()</code>, die eine Adapter Klasse implementieren
  45. muß um eine Authentifizierungsanfrage auszuführen. Jede Adapter Klasse muß vorher vorbereitet sein
  46. bevor <code>authenticate()</code> aufgerufen wird. Diese Vorbereitung des Adapters enthält das
  47. Setzen der Zeugnisse (z.B. Benutzername und Passwort) und die Definition von Werten für
  48. Adapter spezifische Konfigurationoptionen, wie Datenbank Verbindungsdaten für einen Datenbank
  49. Tabellen Adapter.
  50. </para>
  51. <para>
  52. Das folgende ist ein Beispiel eines Authentifierungs-Adapters der einen Benutzernamen und ein
  53. Passwort für die Authentifizierung benötigt. Andere Details, wie zum Beispiel der
  54. Authentifizierungs-Service abgefragt wird, werden der Kürze halber ausgelassen:
  55. <programlisting role="php"><![CDATA[
  56. class MyAuthAdapter implements Zend_Auth_Adapter_Interface
  57. {
  58. /**
  59. * Setzt Benutzername und Passwort für die Authentifizierung
  60. *
  61. * @return void
  62. */
  63. public function __construct($username, $password)
  64. {
  65. // ...
  66. }
  67. /**
  68. * Führt einen Authentifizierungs-Versuch durch
  69. *
  70. * @throws Zend_Auth_Adapter_Exception Wenn die Authentifizierung nicht
  71. * durchgeführt wurde
  72. * @return Zend_Auth_Result
  73. */
  74. public function authenticate()
  75. {
  76. // ...
  77. }
  78. }
  79. ]]>
  80. </programlisting>
  81. Wie im Docblock angegeben, muß <code>authenticate()</code> eine Instanz von
  82. <classname>Zend_Auth_Result</classname> (oder einer von <classname>Zend_Auth_Result</classname> abgeleiteten Klassen)
  83. zurückgeben. Wenn aus bestimmten Gründen eine Durchführung einer Authentifizierungs-Anfrage
  84. nicht möglich ist, sollte <code>authenticate()</code> eine Ausnahme werfen die von
  85. <classname>Zend_Auth_Adapter_Exception</classname> abgeleitet ist.
  86. </para>
  87. </sect2>
  88. <sect2 id="zend.auth.introduction.results">
  89. <title>Ergebnisse</title>
  90. <para>
  91. <classname>Zend_Auth</classname> Adapter geben eine Instanz von <classname>Zend_Auth_Result</classname> mit Hilfe von
  92. <code>authenticate()</code> zurück um die Ergebnisse des Authentifizierungs-Versuches darzustellen.
  93. Adapter veröffentlichen das <classname>Zend_Auth_Result</classname> Objekt bei der Erstellung, so das die
  94. folgenden vier Methoden ein grundsätzliches Set von Benutzerbezogenen Operationen bieten die
  95. für die Ergebnisse von <classname>Zend_Auth</classname> Adapter üblich sind:
  96. <itemizedlist>
  97. <listitem>
  98. <para>
  99. <code>isValid()</code> - Gibt true zurück wenn und nur wenn das Ergebnis einen
  100. erfolgreichen Authentifizierungs-Versuch repräsentiert
  101. </para>
  102. </listitem>
  103. <listitem>
  104. <para>
  105. <code>getCode()</code> - Gibt einen konstanten <classname>Zend_Auth_Result</classname>
  106. Identifizierer damit der Typ des Authentifizierungs-Fehlers, oder des Erfolgs der
  107. stattgefunden hat, ermittelt werden kann. Das kann in Situationen verwendet werden
  108. in denen der Entwickler die verschiedenen Ergebnistypen der Authentifizierung
  109. unterschiedlich behandeln will. Das erlaubt es dem Entwickler zum Beispiel detailierte
  110. Statistiken über die Authentifizierungs-Ergebnisse zu erhalten. Eine andere Verwendung
  111. dieses Features ist es spezielle, benutzerdefinierte Nachrichten anzubieten, um Benutzern
  112. eine bessere Usability zu ermöglichen, einfach dadurch das Entwickler dazu aufgerufen
  113. sind die Risiken solche defailierte Informationen Benutzern anzubieten, statt einer
  114. generellen Nachricht eines Authentifizierungs-Fehlers. Für weitere Informationen siehe
  115. die Notiz anbei.
  116. </para>
  117. </listitem>
  118. <listitem>
  119. <para>
  120. <code>getIdentity()</code> - Gibt die Identität des Authentifizierungs-Versuchs zurück
  121. </para>
  122. </listitem>
  123. <listitem>
  124. <para>
  125. <code>getMessages()</code> - Gibt ein Array von Nachrichten zurück nach einem
  126. fehlgeschlagenen Authentifizierungs-Versuch
  127. </para>
  128. </listitem>
  129. </itemizedlist>
  130. </para>
  131. <para>
  132. Ein Entwickler kann wünschen basierend auf dem Typ des Authentifizierungs-Ergebnisses zu
  133. verzweigen um spezialisiertere Operationen durchzuführen. Einige Operationen die für Entwickler
  134. nützlich sein können sind zum Beispiel das Sperren von Konten nachdem zu oft ein falsches
  135. Passwort angegeben wurde, das markieren von IP Adressen nachdem zuviele nicht existierende
  136. Identitäten angegeben wurden und das anbieten von speziellen, benutzerdefinierten Nachrichten
  137. für Authentifizierungs-Ergebnisse an den Benutzer. Die folgenden Ergebniscodes sind vorhanden:
  138. <programlisting role="php"><![CDATA[
  139. Zend_Auth_Result::SUCCESS
  140. Zend_Auth_Result::FAILURE
  141. Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND
  142. Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS
  143. Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID
  144. Zend_Auth_Result::FAILURE_UNCATEGORIZED
  145. ]]>
  146. </programlisting>
  147. </para>
  148. <para>
  149. Das folgende Beispiel zeigt wie ein Entwickler anhand des Ergebniscodes verzweigen könnte:
  150. <programlisting role="php"><![CDATA[
  151. // Innerhalb von AuthController / loginAction
  152. $result = $this->_auth->authenticate($adapter);
  153. switch ($result->getCode()) {
  154. case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
  155. /** Was wegen nicht existierender Identität machen **/
  156. break;
  157. case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
  158. /** Was wegen ungültigen Zeugnissen machen **/
  159. break;
  160. case Zend_Auth_Result::SUCCESS:
  161. /** Was wegen erfolgreicher Authentifizierung machen **/
  162. break;
  163. default:
  164. /** Was wegen anderen Fehlern machen **/
  165. break;
  166. }
  167. ]]>
  168. </programlisting>
  169. </para>
  170. </sect2>
  171. <sect2 id="zend.auth.introduction.persistence">
  172. <title>Dauerhafte Identitäten</title>
  173. <para>
  174. Eine Anfrage zu authentifizieren die Authentifizierungs Zeugnisse enthält ist per se nützlich,
  175. aber auch wichtig um die Authentifizierungs Identität bearbeiten zu können ohne das immer die
  176. Authentifizierungs Zeugnisse mit jeder Anfrage vorhanden sein müssen.
  177. </para>
  178. <para>
  179. Trotzdem ist HTTP ein statusloses Protokoll, und Techniken wie Cookies und Sessions wurden
  180. entwickelt um Stati über mehrere Anfragen hinweg in Server-seitigen Web Anwendungen zu
  181. erhalten.
  182. </para>
  183. <sect3 id="zend.auth.introduction.persistence.default">
  184. <title>Normale Persistenz in PHP Sessions</title>
  185. <para>
  186. Standardmäßig bietet <classname>Zend_Auth</classname> dauerhafte Speicherung der Identität eines
  187. erfolgreichen Authentifizierungs Versuches durch Verwendung der PHP Session. Bei einem
  188. erfolgreichen Authentifizierungs Versuch speichert <classname>Zend_Auth::authenticate()</classname>
  189. die Identität des Authentifizierungs Ergebnisses im persistenten Speicher. Solange die
  190. Konfiguration nicht verändert wird, verwendet <classname>Zend_Auth</classname> eine Speicherklasse
  191. die <classname>Zend_Auth_Storage_Session</classname> heißt und die im Gegenzug
  192. <link linkend="zend.session"><classname>Zend_Session</classname></link> verwendet. Eine eigene
  193. Klasse kann stattdessen verwendet werden, indem ein Objekt an
  194. <classname>Zend_Auth::setStorage()</classname> übergeben wird welches
  195. <classname>Zend_Auth_Storage_Interface</classname> implementiert.
  196. </para>
  197. <note>
  198. <para>
  199. Wenn das automatische persistente Speichern der Identität für einen bestimmten Anwendungsfall
  200. nicht anwendbar ist, können Entwickler trotzdem die <classname>Zend_Auth</classname> Klasse weiterhin
  201. verwenden statt direkt eine Adapterklasse anzusprechen.
  202. </para>
  203. </note>
  204. <example id="zend.auth.introduction.persistence.default.example">
  205. <title>Den Namensraum der Session ändern</title>
  206. <para>
  207. <classname>Zend_Auth_Storage_Session</classname> verwendet einen Session Namensraum von
  208. 'Zend_Auth'. Diese Namensraum kann überschrieben werden indem ein anderer
  209. Wert an den Konstruktor von <classname>Zend_Auth_Storage_Session</classname> übergeben wird, und dieser
  210. Wert wird intern an den Konstruktor von <classname>Zend_Session_Namespace</classname> weitergereicht.
  211. Das sollte vor einem Versuch einer Authentifizierung stattfinden da
  212. <classname>Zend_Auth::authenticate()</classname> die automatische Speicherung der Identität durchführt.
  213. <programlisting role="php"><![CDATA[
  214. // Eine Referenz zur Singleton Instanz von Zend_Auth speichern
  215. $auth = Zend_Auth::getInstance();
  216. // 'someNamespace' statt 'Zend_Auth' verwenden
  217. $auth->setStorage(new Zend_Auth_Storage_Session('someNamespace'));
  218. /**
  219. * @todo Den Auth Adapter $authAdapter erstellen
  220. */
  221. // Authentifizieren, das Ergebnis speichern, und die Identität bei Erfolg
  222. // persistent machen
  223. $result = $auth->authenticate($authAdapter);
  224. ]]>
  225. </programlisting>
  226. </para>
  227. </example>
  228. </sect3>
  229. <sect3 id="zend.auth.introduction.persistence.custom">
  230. <title>Eigene Speicher implementieren</title>
  231. <para>
  232. Zeitweise wollen Entwickler einen anderen Speichermechanismus für Identitäten verwenden als
  233. es von <classname>Zend_Auth_Storage_Session</classname> angeboten wird. Für solche Fälle können
  234. Entwickler einfach <classname>Zend_Auth_Storage_Interface</classname> implementieren und eine
  235. Instanz der Klasse an <classname>Zend_Auth::setStorage()</classname> übergeben.
  236. </para>
  237. <example id="zend.auth.introduction.persistence.custom.example">
  238. <title>Eine eigene Speicher Klasse verwenden</title>
  239. <para>
  240. Um eine andere Speicherklasse für die Persistenz von Identitäten zu verwenden als sie
  241. durch <classname>Zend_Auth_Storage_Session</classname> angeboten wird, können Entwickler
  242. <classname>Zend_Auth_Storage_Interface</classname> implementieren:
  243. <programlisting role="php"><![CDATA[
  244. class MyStorage implements Zend_Auth_Storage_Interface
  245. {
  246. /**
  247. * Gibt true zurück wenn und nur wenn der Speicher leer ist
  248. *
  249. * @throws Zend_Auth_Storage_Exception Wenn es unmöglich ist festzustellen
  250. * ob der Speicher leer ist
  251. * @return boolean
  252. */
  253. public function isEmpty()
  254. {
  255. /**
  256. * @todo Implementierung
  257. */
  258. }
  259. /**
  260. * Gibt den Inhalt des Speichers zurück
  261. *
  262. * Das Verhalten ist undefiniert wenn der Speicher leer ist.
  263. *
  264. * @throws Zend_Auth_Storage_Exception Wenn das Lesen von Lesen vom Speicher
  265. * unmöglich ist
  266. * @return mixed
  267. */
  268. public function read()
  269. {
  270. /**
  271. * @todo Implementierung
  272. */
  273. }
  274. /**
  275. * Schreibt $contents in den Speicher
  276. *
  277. * @param mixed $contents
  278. * @throws Zend_Auth_Storage_Exception Wenn das Schreiben von $contents in
  279. * den Speicher unmöglich ist
  280. * @return void
  281. */
  282. public function write($contents)
  283. {
  284. /**
  285. * @todo Implementierung
  286. */
  287. }
  288. /**
  289. * Löscht die Intalte vom Speicher
  290. *
  291. * @throws Zend_Auth_Storage_Exception Wenn das Löschen der Inhalte vom
  292. * Speicher unmöglich ist
  293. * @return void
  294. */
  295. public function clear()
  296. {
  297. /**
  298. * @todo Implementierung
  299. */
  300. }
  301. }
  302. ]]>
  303. </programlisting>
  304. </para>
  305. <para>
  306. Um diese selbstgeschriebene Speicherklasse zu verwenden wird
  307. <classname>Zend_Auth::setStorage()</classname> aufgerufen bevor eine Authentifizierungsanfrage
  308. stattfindet:
  309. <programlisting role="php"><![CDATA[
  310. // Zend_Auth anweisen das die selbstdefinierte Speicherklasse verwendet wird
  311. Zend_Auth::getInstance()->setStorage(new MyStorage());
  312. /**
  313. * @todo Den Auth Adapter $authAdapter erstellen
  314. */
  315. // Authentifizieren, das Ergebnis speichern, und die Identität bei Erfolg
  316. $result = Zend_Auth::getInstance()->authenticate($authAdapter);
  317. ]]>
  318. </programlisting>
  319. </para>
  320. </example>
  321. </sect3>
  322. </sect2>
  323. <sect2 id="zend.auth.introduction.using">
  324. <title>Verwendung</title>
  325. <para>
  326. Es gibt zwei vorhandene Wege um <classname>Zend_Auth</classname> Adapter zu verwenden:
  327. <orderedlist>
  328. <listitem>
  329. <para>
  330. Indirekt durch <classname>Zend_Auth::authenticate()</classname>
  331. </para>
  332. </listitem>
  333. <listitem>
  334. <para>
  335. Direkt durch die <code>authenticate()</code> Methode des Adapters
  336. </para>
  337. </listitem>
  338. </orderedlist>
  339. </para>
  340. <para>
  341. Das folgende Beispiel zeigt wie ein <classname>Zend_Auth</classname> Adapter indirekt verwendet
  342. werden kann, durch die Verwendung der <classname>Zend_Auth</classname> Klasse:
  343. <programlisting role="php"><![CDATA[
  344. // Eine Referenz zur Singleton-Instanz von Zend_Auth erhalten
  345. $auth = Zend_Auth::getInstance();
  346. // Authentifizierungs Adapter erstellen
  347. $authAdapter = new MyAuthAdapter($username, $password);
  348. // Authentifizierungs Versuch, das Ergebnis abspeichern
  349. $result = $auth->authenticate($authAdapter);
  350. if (!$result->isValid()) {
  351. // Authentifizierung fehlgeschlagen; die genauen Gründe ausgeben
  352. foreach ($result->getMessages() as $message) {
  353. echo "$message\n";
  354. }
  355. } else {
  356. // Authentifizierung erfolgreich; die Identität ($username) wird in
  357. // der Session gespeichert
  358. // $result->getIdentity() === $auth->getIdentity()
  359. // $result->getIdentity() === $username
  360. }
  361. ]]>
  362. </programlisting>
  363. </para>
  364. <para>
  365. Sobald die Authentifizierung in einer Anfrage durchgeführt wurde, so wie im obigen Beispiel,
  366. ist es sehr einfach zu Prüfen ob eine erfolgreich authentifizierte Identität existiert:
  367. <programlisting role="php"><![CDATA[
  368. $auth = Zend_Auth::getInstance();
  369. if ($auth->hasIdentity()) {
  370. // Identität existiert; auslesen
  371. $identity = $auth->getIdentity();
  372. }
  373. ]]>
  374. </programlisting>
  375. </para>
  376. <para>
  377. Um eine Identität vom persistenten Speicher zu entfernen muß einfach die <code>clearIdentity()</code>
  378. Methode verwendet werden. Das würde typischerweise für die Implementierung einer "Abmelde" Operation
  379. in einer Anwendung Verwendung finden.
  380. <programlisting role="php"><![CDATA[
  381. Zend_Auth::getInstance()->clearIdentity();
  382. ]]>
  383. </programlisting>
  384. </para>
  385. <para>
  386. Wenn die automatische Verwendung von persistenten Speichern für einen bestimmten Verwendungszweck
  387. unangebracht ist, kann ein Entwickler einfach die Verwendung der <classname>Zend_Auth</classname> Klasse
  388. umgehen, und eine Adapter Klasse direkt verwenden. Die direkte Verwendung einer Adapterklasse
  389. enthält das Konfigurieren und Vorbereiten eines Adapter Objektes und den Aufruf dessen
  390. <code>authenticate()</code> Methode. Adapter-spezifische Details werden in der Dokumentation
  391. jeden Adapters besprochen. Das folgende Beispeil verwendet <code>MyAuthAdapter</code> direkt:
  392. <programlisting role="php"><![CDATA[
  393. // Den Authentifizierungs Adapter erstellen
  394. $authAdapter = new MyAuthAdapter($username, $password);
  395. // Authentifizierungs Versuch, speichere das Ergebnis
  396. $result = $authAdapter->authenticate();
  397. if (!$result->isValid()) {
  398. // Authentifizierung fehlgeschlagen; die genauen Gründe ausgeben
  399. foreach ($result->getMessages() as $message) {
  400. echo "$message\n";
  401. }
  402. } else {
  403. // Authentifizierung erfolgreich
  404. // $result->getIdentity() === $username
  405. }
  406. ]]>
  407. </programlisting>
  408. </para>
  409. </sect2>
  410. </sect1>
  411. <!--
  412. vim:se ts=4 sw=4 et:
  413. -->