Zend_Auth.xml 20 KB

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