Zend_Auth.xml 20 KB

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