multiuser-authentication.xml 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20876 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.multiuser.authentication">
  5. <title>Benutzer im Zend Framework authentifizieren</title>
  6. <sect2 id="learning.multiuser.authentication.intro">
  7. <title>Einführung in die Authentifizierung</title>
  8. <para>
  9. Sobald eine Web Anwendung in der Lage ist Benutzer von anderen Benutzern zu
  10. unterscheiden, indem eine Session aufgebaut wird, prüfen Web Anwendungen normalerweise
  11. die Identität eines Benutzers. Der Prozess der Prüfung eines Konsumenten als authentisch
  12. wird als "Authentifizierung" bezeichnet. Authentifizierung besteht auf zwei getrennten
  13. Teilen: Einer Identität und einem Set von Zeugnissen. Es muss eine Variation von
  14. beidem in der Anwendung für die Bearbeitung vorhanden sein damit diese einen Benutzer
  15. authentifizieren kann.
  16. </para>
  17. <para>
  18. Wärend die meisten üblichen Pattern der Authentifizierung um Benutzernamen und
  19. Passwörtern dreht, sollte erwähnt werden das dies nicht immer der Fall ist. Identitäten
  20. sind nicht auf Benutzernamen limitiert. Faktisch kann jeder öffentliche Identifikator
  21. verwendet werden: eine zugeordnete Nummer, Sozialversicherungsnummer, oder eine
  22. Wohnanschrift. Genauso sind Zeugnisse nicht auf Passwörter begrenzt. Zeugnisse können
  23. in Form von geschützten privaten Informationen kommen: Fingerabdrücke, Augen Retinascan,
  24. Passphrase, oder jede andere obskure personelle Information.
  25. </para>
  26. </sect2>
  27. <sect2 id="learning.multiuser.authentication.basic-usage">
  28. <title>Grundsätzliche Verwendung von Zend_Auth</title>
  29. <para>
  30. Im folgenden Beispiel verwenden wir <classname>Zend_Auth</classname> um zu komplettieren
  31. was möglicherweise die meist gelebte Form der Authentifizierung ist: Benutzername und
  32. Passwort von einer Datenbank Tabelle. Dieses Beispiel nimmt an dass man die eigene
  33. Anwendung bereits durch Verwendung von <classname>Zend_Application</classname>
  34. eingerichtet hat, und das man in der Anwendung eine Datenbank Verbindung konfiguriert
  35. hat.
  36. </para>
  37. <para>
  38. Der Job der <classname>Zend_Auth</classname> Klasse ist zweigeteilt. Erstens sollte Sie
  39. in der Lage sein einen Authentifizierungs Adapter zu akzeptieren um einen Benutzer zu
  40. authentifizieren. Zweitens sollte Sie, nach einer erfolgreichen Authentifizierung eines
  41. Benutzers, durch jede und alle Abfragen persistent sein welche wissen müssen ob der
  42. aktuelle Benutzer authentifiziert wurde. Um diese Daten zu persistieren verwendet
  43. <classname>Zend_Auth</classname> <classname>Zend_Session_Namespace</classname>, man muss
  44. aber generell nie mit diesem Session Objekt interagieren.
  45. </para>
  46. <para>
  47. Angenommen wir haben die folgende Datenbanktabelle konfiguriert:
  48. </para>
  49. <programlisting language="php"><![CDATA[
  50. CREATE TABLE users (
  51. id INTEGER NOT NULL PRIMARY KEY,
  52. username VARCHAR(50) UNIQUE NOT NULL,
  53. password VARCHAR(32) NULL,
  54. password_salt VARCHAR(32) NULL,
  55. real_name VARCHAR(150) NULL
  56. )
  57. ]]></programlisting>
  58. <para>
  59. Das oben stehende demonstriert eine Benutzertabelle welche einen Benutzernamen, ein
  60. Passwort und auch eine Passwort Salt Spalte enthält. Diese Salt Spalte wird als Teil
  61. einer Technik verwendet welche Salting genannt wird und die Sicherheit der Datenbank
  62. für Informationen gegen Brute Force Attacken erhöht welche auf den Algorithmus des
  63. Hashings vom Passwort abziehlt. <ulink
  64. url="http://en.wikipedia.org/wiki/Salting_%28cryptography%29">Weitere
  65. Informationen</ulink> über Salting.
  66. </para>
  67. <para>
  68. Für diese Implementation müssen wir zuerst ein einfaches Formular erstellen welches
  69. wir als "Login Formular" verwenden können. Wir nehmen <classname>Zend_Form</classname>
  70. um das zu ermöglichen.
  71. </para>
  72. <programlisting language="php"><![CDATA[
  73. // Steht unter application/forms/Auth/Login.php
  74. class Default_Form_Auth_Login extends Zend_Form
  75. {
  76. public function init()
  77. {
  78. $this->setMethod('post');
  79. $this->addElement(
  80. 'text', 'username', array(
  81. 'label' => 'Username:',
  82. 'required' => true,
  83. 'filters' => array('StringTrim'),
  84. ));
  85. $this->addElement('password', 'password', array(
  86. 'label' => 'Passwort:',
  87. 'required' => true,
  88. ));
  89. $this->addElement('submit', 'submit', array(
  90. 'ignore' => true,
  91. 'label' => 'Login',
  92. ));
  93. }
  94. }
  95. ]]></programlisting>
  96. <para>
  97. Mit dem oben stehenden Formular können wir weitermachen und unsere Login Aktion für
  98. unseren Authentifizierungs Controller erstellen. Dieser Controller wird
  99. "<classname>AuthController</classname>" genannt, und wird unter
  100. <filename>application/controllers/AuthController.php</filename> zu finden sein. Er wird
  101. eine einzelne Methode enthalten welche "<methodname>loginAction()</methodname>" heißt
  102. und als selbst-übermittelnde Aktion fungiert. In anderen Worten, unabhängig davon ob
  103. die Url mit POST oder mit GET geschickt wurde, wird diese Methode die Logik behandeln.
  104. </para>
  105. <para>
  106. Der folgende Code demonstriert wie die richtigen Adapter erstellt und in das Formular
  107. integriert werden:
  108. </para>
  109. <programlisting language="php"><![CDATA[
  110. class AuthController extends Zend_Controller_Action
  111. {
  112. public function loginAction()
  113. {
  114. $db = $this->_getParam('db');
  115. $loginForm = new Default_Form_Auth_Login($_POST);
  116. if ($loginForm->isValid()) {
  117. $adapter = new Zend_Auth_Adapter_DbTable(
  118. $db,
  119. 'users',
  120. 'username',
  121. 'password',
  122. 'MD5(CONCAT(?, password_salt))'
  123. );
  124. $adapter->setIdentity($loginForm->getValue('username'));
  125. $adapter->setCredential($loginForm->getValue('password'));
  126. $result = $auth->authenticate($adapter);
  127. if ($result->isValid()) {
  128. $this->_helper->FlashMessenger('Erfolgreich angemeldet');
  129. $this->redirect('/');
  130. return;
  131. }
  132. }
  133. $this->view->loginForm = $loginForm;
  134. }
  135. }
  136. ]]></programlisting>
  137. <para>
  138. Das entsprechende View Skript ist für diese Aktion recht einfach. Es setzt die aktuelle
  139. Url da dieses Formular selbst bearbeitend ist, und zeigt das Formular an. Dieses View
  140. Skript ist unter <filename>application/views/scripts/auth/login.phtml</filename> zu
  141. finden:
  142. </para>
  143. <programlisting language="php"><![CDATA[
  144. $this->form->setAction($this->url());
  145. echo $this->form;
  146. ]]></programlisting>
  147. <para>
  148. Das ist es. Mit diesen Grundsätzen kann man die generellen Konzepte erweitern um
  149. komplexere Authentifizierungs Szenarien zu inkludieren. Für mehr Informationen über
  150. andere <classname>Zend_Auth</classname> Adapter sollte in <link
  151. linkend="zend.auth">das Referenz Handbuch</link> gesehen werden.
  152. </para>
  153. </sect2>
  154. </sect1>