Zend_Auth_Adapter_Ldap.xml 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.auth.adapter.ldap">
  5. <title>LDAP Authentifizierung</title>
  6. <sect2 id="zend.auth.adapter.ldap.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. <classname>Zend_Auth_Adapter_Ldap</classname> unterstützt Webanwendungen bei der
  10. Authentifizierung mit <acronym>LDAP</acronym> Services. Die Features beinhalten
  11. Kanonisierung von Benutzernamen und Domainnamen, Mehrfach-Domain Authentifizierung, und
  12. Fehlerbehandlungs Features. Es wurde getestet mit <ulink
  13. url="http://www.microsoft.com/windowsserver2003/technologies/directory/activedirectory/">Microsoft
  14. Active Directory</ulink> und <ulink url="http://www.openldap.org/">OpenLDAP</ulink>,
  15. sollte auch mit anderen <acronym>LDAP</acronym> Service Provider zusammenarbeiten.
  16. </para>
  17. <para>
  18. Diese Dokumentation enthält eine Anleitung der Verwendung von
  19. <classname>Zend_Auth_Adapter_Ldap</classname>, eine Beschreibung der
  20. <acronym>API</acronym>, eine Ausgabe der verschiedenen Optionen, Diagnostische
  21. Informationen für die Fehlerbehandlung bei Authentifizierungs Problemen, und Beispiel
  22. Optionen für beide, Active Directory und OpenLDAP Server.
  23. </para>
  24. </sect2>
  25. <sect2 id="zend.auth.adapter.ldap.usage">
  26. <title>Verwendung</title>
  27. <para>
  28. Um <classname>Zend_Auth_Adapter_Ldap</classname> Authentifizierung in eigene Anwendungen
  29. schnell einzubauen, selbst wenn <classname>Zend_Controller</classname> nicht verwendet
  30. wird, sollte das Fleisch des eigenen Codes in etwa wie folgt aussehen:
  31. </para>
  32. <programlisting language="php"><![CDATA[
  33. $username = $this->_request->getParam('username');
  34. $password = $this->_request->getParam('password');
  35. $auth = Zend_Auth::getInstance();
  36. $config = new Zend_Config_Ini('../application/config/config.ini',
  37. 'production');
  38. $log_path = $config->ldap->log_path;
  39. $options = $config->ldap->toArray();
  40. unset($options['log_path']);
  41. $adapter = new Zend_Auth_Adapter_Ldap($options, $username,
  42. $password);
  43. $result = $auth->authenticate($adapter);
  44. if ($log_path) {
  45. $messages = $result->getMessages();
  46. $logger = new Zend_Log();
  47. $logger->addWriter(new Zend_Log_Writer_Stream($log_path));
  48. $filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG);
  49. $logger->addFilter($filter);
  50. foreach ($messages as $i => $message) {
  51. if ($i-- > 1) { // $messages[2] und höher sind Log Nachrichten
  52. $message = str_replace("\n", "\n ", $message);
  53. $logger->log("Ldap: $i: $message", Zend_Log::DEBUG);
  54. }
  55. }
  56. }
  57. ]]></programlisting>
  58. <para>
  59. Natürlich ist der Logging Code optional, aber es wird dringend empfohlen einen Logger
  60. zu verwenden. <classname>Zend_Auth_Adapter_Ldap</classname> zeichnet fast jedes
  61. Bisschen an Information in <varname>$messages</varname> auf das irgendwer benötigen
  62. können (mehr anbei), was allerdings selbst ein nettes Feature für jemanden als History
  63. ist, kann überaus schwierig zu debuggen sein.
  64. </para>
  65. <para>
  66. Der <classname>Zend_Config_Ini</classname> wird oben verwendet um die Optionen des
  67. Adapters zu laden. Er ist also auch optional. Ein reguläres Array würde genauso gut
  68. arbeiten. Das folgende ist eine Beispiel
  69. <filename>application/config/config.ini</filename> Datei die Optionen für zwei separate
  70. Server hat. Mit mehreren Sets von Server Optionen versucht der Adapter jede in
  71. Reihenfolge bis die Zugangsdaten erfolgreich authentifiziert wurden. Die Namen der
  72. Server (z.B., 'server1' und 'server2') sind sehr verallgemeinert. Für Details
  73. betreffend dem Array für Optionen, siehe das Kapitel über <emphasis>Server
  74. Optionen</emphasis> weiter unten. Es ist zu beachten das
  75. <classname>Zend_Config_Ini</classname> jeden Wert der mit Gleichheitszeichen
  76. (<emphasis>=</emphasis>) geschrieben wird auch unter Anführungszeichen gesetzt wird
  77. (wie unten bei DNs gezeigt).
  78. </para>
  79. <programlisting language="ini"><![CDATA[
  80. [production]
  81. ldap.log_path = /tmp/ldap.log
  82. ; Typische Optionen für OpenLDAP
  83. ldap.server1.host = s0.foo.net
  84. ldap.server1.accountDomainName = foo.net
  85. ldap.server1.accountDomainNameShort = FOO
  86. ldap.server1.accountCanonicalForm = 3
  87. ldap.server1.username = "CN=user1,DC=foo,DC=net"
  88. ldap.server1.password = pass1
  89. ldap.server1.baseDn = "OU=Sales,DC=foo,DC=net"
  90. ldap.server1.bindRequiresDn = true
  91. ; Typische Optionen für Active Directory
  92. ldap.server2.host = dc1.w.net
  93. ldap.server2.useStartTls = true
  94. ldap.server2.accountDomainName = w.net
  95. ldap.server2.accountDomainNameShort = W
  96. ldap.server2.accountCanonicalForm = 3
  97. ldap.server2.baseDn = "CN=Users,DC=w,DC=net"
  98. ]]></programlisting>
  99. <para>
  100. Die obige Konfiguration instruiert <classname>Zend_Auth_Adapter_Ldap</classname> das es
  101. versuchen soll Benutzer zuerst mit dem OpenLDAP Server <filename>s0.foo.net</filename>
  102. authentifizieren soll. Wenn die Authentifizierung auf irgendeinem Grund fehlschlägt,
  103. wird der AD Server <filename>dc1.w.net</filename> versucht.
  104. </para>
  105. <para>
  106. Mit Servern in verschiedenen Domains, zeigt diese Konfiguration Multi-Domain
  107. Authentifizierung. Es können auch mehrere Server in der gleichen Domain sein um
  108. Redundanz anzubieten.
  109. </para>
  110. <para>
  111. In diesem Fall ist zu beachten das, selbst wenn OpenLDAP keine Notwendigkeit für kurze
  112. NetBIOS Stil Domainnamen hat die von Windows verwendet werden bieten wir Sie hier an
  113. wegen der Kanonifizierung der Namen (beschrieben im
  114. <emphasis>Kanonifizierung von Benutzernamen</emphasis> Kapitel anbei).
  115. </para>
  116. </sect2>
  117. <sect2 id="zend.auth.adapter.ldap.api">
  118. <title>Die API</title>
  119. <para>
  120. Der <classname>Zend_Auth_Adapter_Ldap</classname> Konstruktor akzeptiert drei Parameter.
  121. </para>
  122. <para>
  123. Der <varname>$options</varname> Parameter wird benötigt und muß ein Array sein das ein
  124. oder mehrere Sets von Optionen enthält. Es ist zu beachten das es sich um
  125. <emphasis>Array von Arrays</emphasis> von <link
  126. linkend="zend.ldap"><classname>Zend_Ldap</classname></link> Optionen handelt. Selbst
  127. wenn nur ein einzelner <acronym>LDAP</acronym> Server verwendet wird, müssen die
  128. Optionen trotzdem in einem anderen Array sein.
  129. </para>
  130. <para>
  131. Anbei ist eine <ulink
  132. url="http://php.net/print_r"><methodname>print_r()</methodname></ulink>
  133. Ausgabe von beispielhaften Optionsparameters die zwei Sets von Serveroptionen für
  134. <acronym>LDAP</acronym> Server enthalten, <filename>s0.foo.net</filename> und
  135. <filename>dc1.w.net</filename> (die gleichen Optionen wie in der oberen
  136. <acronym>INI</acronym> Repräsentation):
  137. </para>
  138. <programlisting language="output"><![CDATA[
  139. Array
  140. (
  141. [server2] => Array
  142. (
  143. [host] => dc1.w.net
  144. [useStartTls] => 1
  145. [accountDomainName] => w.net
  146. [accountDomainNameShort] => W
  147. [accountCanonicalForm] => 3
  148. [baseDn] => CN=Users,DC=w,DC=net
  149. )
  150. [server1] => Array
  151. (
  152. [host] => s0.foo.net
  153. [accountDomainName] => foo.net
  154. [accountDomainNameShort] => FOO
  155. [accountCanonicalForm] => 3
  156. [username] => CN=user1,DC=foo,DC=net
  157. [password] => pass1
  158. [baseDn] => OU=Sales,DC=foo,DC=net
  159. [bindRequiresDn] => 1
  160. )
  161. )
  162. ]]></programlisting>
  163. <para>
  164. Die oben angebotene Information in jedem Set von Optionen ist hauptsächlich deswegen
  165. unterschiedlich weil AD keinen Benutzernamen während des Bindesn in der DN Form benötigt
  166. (siehe die <property>bindRequiresDn</property> Option des
  167. <emphasis>Server Optionen</emphasis> Kapitels weiter unten), was bedeutet das die
  168. Anzahl der, mit dem Empfangen der DN, für einen Benutzernamen der Authentifiziert
  169. werden soll, assoziierten Optionen, unterdrückt werden kann.
  170. </para>
  171. <note>
  172. <title>Was ist ein ausgezeichneter Name?</title>
  173. <para>
  174. Ein DN oder "distinguished name" ist ein String der den Pfad zu einem Objekt im
  175. <acronym>LDAP</acronym> Verzeichnis repräsentiert. Jede komma-seperierte Komponente
  176. ist ein Attribut und Wert der einen Node repräsentiert. Die Komponenten werden
  177. rückwirkend evaluiert. Zum Beispiel ist der Benutzeraccount
  178. <emphasis>CN=Bob Carter,CN=Users,DC=w,DC=net</emphasis> direkt in
  179. <emphasis>CN=Users,DC=w,DC=net container</emphasis> enthalten. Diese Struktur wird
  180. am besten mit einem <acronym>LDAP</acronym> Browser wie das <acronym>ADSI</acronym>
  181. Edit <acronym>MMC</acronym> snap-in für Active Directory oder phpLDAPadmin erkundet.
  182. </para>
  183. </note>
  184. <para>
  185. Die Namen von Servern (z.B. 'server1' und 'server2' wie unten gezeigt) sind großteils
  186. beliebig, aber aus Gründen der Verwendung von <classname>Zend_Config</classname>
  187. sollten die Identifikatoren (im Gegensatz dazu das Sie nummerische Indezes sind)
  188. vorhanden sein, und sollten keine spezielle Zeichen enthalten die vom assoziierten
  189. Dateiformat verwendet werden (z.B. der '<emphasis>.</emphasis>' <acronym>INI</acronym>
  190. Eigenschafts Separator, '<emphasis>&amp;</emphasis>' für <acronym>XML</acronym> Entity
  191. Referenzen, usw.).
  192. </para>
  193. <para>
  194. Mit mehreren Sets von Serveroptionen, kann der Adapter Benutzer in mehreren Domains
  195. authentifizieren und bietet ein Failover damit, wenn ein Server nicht erreichbar ist,
  196. ein anderer abgefragt wird.
  197. </para>
  198. <note>
  199. <title>Die glorreichen Details: Was passiert bei der Authentifizierungs Methode?</title>
  200. <para>
  201. Wenn die <methodname>authenticate()</methodname> Methode aufgerufen wird, iteriert
  202. der Adapter über jedes Set von Serveroptione, setzt diese auf der internen
  203. <classname>Zend_Ldap</classname> Instanz und ruft die
  204. <methodname>Zend_Ldap::bind()</methodname> Methode, mit dem Benutzernamen und
  205. Passwort das authentifiziert werden soll, auf. Die <classname>Zend_Ldap</classname>
  206. Klasse prüft um zu sehen ob der Benutzer mit einer Domain qualifiziert ist (hat
  207. z.B. eine Domainkomponente wie <filename>alice@foo.net</filename> oder
  208. <filename>FOO\alice</filename>). Wenn eine Domain vorhanden ist, aber mit keiner
  209. der Domainnamen der Server (<filename>foo.net</filename> oder
  210. <acronym>FOO</acronym>) übereinstimmt, wird eine spezielle Ausnahme geworfen und
  211. durch <classname>Zend_Auth_Adapter_Ldap</classname> gefangen, was bewirkt das der
  212. Server ignoriert wird und der nächste, in den Serveroptionen gesetzte Server,
  213. ausgewählt wird. Wenn eine Domain <emphasis>doch</emphasis> passt, oder der
  214. Benutzer keinen qualifizierten Benutzernamen angegeben hat, fährt
  215. <classname>Zend_Ldap</classname> weiter fort und versucht mit den angegebenen
  216. Zugangsdaten zu binden. Wenn das Binden nicht erfolgreich war wirft
  217. <classname>Zend_Ldap</classname> eine <classname>Zend_Ldap_Exception</classname>
  218. welche durch <classname>Zend_Auth_Adapter_Ldap</classname> gefangen wird, und das
  219. nächste Set von Serveroptionen wird versucht. Wenn das Binden erfolgreich war, wird
  220. die Iteration gestoppt, und die <methodname>authenticate()</methodname> Methode des
  221. Adapters gibt ein erfolgreiches Ergebnis zurück. Wenn alle Serveroptionen ohne
  222. Erfolg durchprobiert wurden, schlägt die Authentifizierung fehl, und
  223. <methodname>authenticate()</methodname> gibt ein Fehlerergebnis zurück mit der
  224. Fehlermeldung der letzten Iteration.
  225. </para>
  226. </note>
  227. <para>
  228. Die username und password Parameter des <classname>Zend_Auth_Adapter_Ldap</classname>
  229. Konstruktors repräsentieren die Zugangsdaten die authentifiziert werden sollen (z.B.
  230. die Zugangsdaten die durch den Benutzer über eine <acronym>HTML</acronym> Login Form
  231. angegeben werden). Alternativ können Sie auch mit den
  232. <methodname>setUsername()</methodname> und <methodname>setPassword()</methodname>
  233. Methoden gesetzt werden.
  234. </para>
  235. </sect2>
  236. <sect2 id="zend.auth.adapter.ldap.server-options">
  237. <title>Server Optionen</title>
  238. <para>
  239. Jedes Set von Serveroptionen <emphasis>im Kontext von
  240. <classname>Zend_Auth_Adapter_Ldap</classname></emphasis> besteht aus den folgenden
  241. Optionen welche, großteils ungeändert, an
  242. <methodname>Zend_Ldap::setOptions()</methodname> übergeben werden:
  243. </para>
  244. <table id="zend.auth.adapter.ldap.server-options.table">
  245. <title>Server Optionen</title>
  246. <tgroup cols="2">
  247. <thead>
  248. <row>
  249. <entry>Name</entry>
  250. <entry>Beschreibung</entry>
  251. </row>
  252. </thead>
  253. <tbody>
  254. <row>
  255. <entry><emphasis><property>host</property></emphasis></entry>
  256. <entry>
  257. Der Hostname des <acronym>LDAP</acronym> Servers der diese Optionen
  258. repräsentiert. Diese Option wird benötigt.
  259. </entry>
  260. </row>
  261. <row>
  262. <entry><emphasis><property>port</property></emphasis></entry>
  263. <entry>
  264. Der Port auf den der <acronym>LDAP</acronym> Server schaut. Wenn
  265. <emphasis>useSsl</emphasis> <constant>TRUE</constant> ist, ist der
  266. Standardwert von <property>port</property> 636. Wenn
  267. <property>useSsl</property> <constant>FALSE</constant> ist, ist der
  268. Standardwert von <property>port</property> 389.
  269. </entry>
  270. </row>
  271. <row>
  272. <entry><emphasis><property>useStartTls</property></emphasis></entry>
  273. <entry>
  274. Ob der <acronym>LDAP</acronym> Client einen <acronym>TSL</acronym> (aka
  275. <acronym>SSL</acronym>v2) verschlüsselten Transport verwenden soll oder
  276. nicht. Der Wert <constant>TRUE</constant> wird in einer
  277. Produktionsumgebung strengstens empfohlen um zu verhindern das
  278. Passwörter im Klartext übertragen werden. Der Standardwert ist
  279. <constant>FALSE</constant>, da Server typischerweise nach deren
  280. Installation erwarten das ein Zertifikat installiert wird. Die
  281. <property>useSsl</property> und <property>useStartTls</property>
  282. Optionen schließen sich gegenseitig aus. Die
  283. <property>useStartTls</property> Option sollte über
  284. <property>useSsl</property> favorisiert werden, aber nicht alle Server
  285. unterstützen diesen neueren Mechanismus.
  286. </entry>
  287. </row>
  288. <row>
  289. <entry><emphasis><property>useSsl</property></emphasis></entry>
  290. <entry>
  291. Ob der <acronym>LDAP</acronym> Client einen <acronym>SSL</acronym>
  292. verschlüsselten Transport verwenden soll. Die
  293. <property>useSsl</property> und <property>useStartTls</property>
  294. Optionen schließen sich gegenseitig aus, aber
  295. <property>useStartTls</property> sollte favorisiert werden wenn der
  296. Server und die <acronym>LDAP</acronym> Bibliothek des Clients diese
  297. unterstützen. Dieser Wert ändert auch den Standardwert von
  298. <property>port</property> (siehe die <property>port</property>
  299. Beschreibung weiter oben).
  300. </entry>
  301. </row>
  302. <row>
  303. <entry><emphasis><property>username</property></emphasis></entry>
  304. <entry>
  305. Der DN des Accounts der verwendet wird um DN Account Loopups
  306. durchzuführen. <acronym>LDAP</acronym> Server die den Benutzernamen
  307. in DN Form benötigen wenn "bind" durchgeführt wird, benötigen diese
  308. Option. Wenn <property>bindRequiresDn</property>
  309. <constant>TRUE</constant> ist, wird diese Option benötigt. Dieser
  310. Account muß kein privilegierter Account sein - ein Account mit nur-lese
  311. Zugriff zu Objekten unter <property>baseDn</property> ist alles was
  312. notwendig ist (und bevorzugt unter dem <emphasis>Prinzip des geringsten
  313. Privilegs</emphasis>).
  314. </entry>
  315. </row>
  316. <row>
  317. <entry><emphasis><property>password</property></emphasis></entry>
  318. <entry>
  319. Das Passwort des Accounts der verwendet wird um DN Lookups
  320. durchzuführen. Wenn diese Option nicht unterstützt wird, versucht der
  321. <acronym>LDAP</acronym> Client einen "anonymen bind" wenn DN Lookups
  322. durchgeführt werden.
  323. </entry>
  324. </row>
  325. <row>
  326. <entry><emphasis><property>bindRequiresDn</property></emphasis></entry>
  327. <entry>
  328. Einige <acronym>LDAP</acronym> Server benötigen den zum Binden
  329. verwendeten Benutzernamen in der DN Form wie
  330. <emphasis>CN=Alice Baker,OU=Sales,DC=foo,DC=net</emphasis>
  331. (grundsätzlich alle Server <emphasis>außer</emphasis> AD). Wenn diese
  332. Option <constant>TRUE</constant> ist, instuiert dies
  333. <classname>Zend_Ldap</classname> das der DN automatisch empfangen wird,
  334. abhängig vom Benutzernamen der authentifiziert wird, wenn er nicht
  335. bereits in DN Form ist, und diesen dann wieder mit der richtigen DN zu
  336. binden. Der Standardwert ist <constant>FALSE</constant>. Aktuell ist nur
  337. von Microsoft Active Directory Server (<acronym>ADS</acronym>) bekannt
  338. das es den Benutzernamen <emphasis>nicht</emphasis> in der DN Form
  339. benötigt wenn gebunden wird, und deswegen kann diese Option mit AD auch
  340. <constant>FALSE</constant> sein (und sollte das auch, da das Empfangen
  341. des DN eine extra Anfrage zum Server benötigt). Andernfalls muß diese
  342. Option auf <constant>TRUE</constant> gesetzt werden (z.B. für OpenLDAP).
  343. Diese Option kontrolliert das Standard
  344. <property>acountFilterFormat</property> das verwendet wird wenn nach
  345. Accounts gesucht wird. Siehe auch die
  346. <property>accountFilterFormat</property> Option.
  347. </entry>
  348. </row>
  349. <row>
  350. <entry><emphasis><property>baseDn</property></emphasis></entry>
  351. <entry>
  352. Der Ort vom DN unter dem alle Accounts die authentifiziert werden. Diese
  353. Option wird benötigt. Wenn man sich unsicher über den richtigen
  354. <property>baseDn</property> ist, sollte es genug sein Ihn von
  355. der <acronym>DNS</acronym> Domain des Benutzers der die
  356. <emphasis>DC=</emphasis> Komponenten verwedet abzuleiten. Wenn der
  357. Hauptname eines Benutzers <filename>alice@foo.net</filename> ist, sollte
  358. ein <property>baseDn</property> von <emphasis>DC=foo,DC=net</emphasis>
  359. funktionieren. Eine präzisere Ortsangabe
  360. (z.B. <emphasis>OU=Sales,DC=foo,DC=net</emphasis>) ist trotzdem
  361. effizienter.
  362. </entry>
  363. </row>
  364. <row>
  365. <entry><emphasis><property>accountCanonicalForm</property></emphasis></entry>
  366. <entry>
  367. Ein Wert von 2, 3 oder 4 zeigt die Form zu der Account Namen
  368. authorisiert werden sollten nachdem die Authentifizierung erfolgreich
  369. war. Die Werte sind wie folgt: 2 für traditionelle Benutzernamen-Stil
  370. Namen (z.B., <emphasis>alice</emphasis>), 3 für Schrägstrich-Stil Namen
  371. (z.B., <filename>FOO\alice</filename>) oder 4 für Authentifiziert-Sil
  372. Namen (z.B., <filename>alice@foo.net</filename>). Der Standardwert ist 4
  373. (z.B., <filename>alice@foo.net</filename>). Mit einem Wert von 3, z.B.,
  374. wird die Identität die von
  375. <methodname>Zend_Auth_Result::getIdentity()</methodname> zurückgegeben
  376. wird (und <methodname>Zend_Auth::getIdentity()</methodname>, wenn
  377. <classname>Zend_Auth</classname> verwendet wird), immer
  378. <filename>FOO\alice</filename> sein, unabhängig von der Form in der
  379. Alice angegeben wurde, egal ob es <emphasis>alice</emphasis>,
  380. <filename>alice@foo.net</filename>, <filename>FOO\alice</filename>,
  381. <filename>FoO\aLicE</filename>, <filename>foo.net\alice</filename>, etc.
  382. Siehe das Kapitel <emphasis>Kanonisierung von Account Namen</emphasis>
  383. in der <classname>Zend_Ldap</classname> Dokumentation für Details. Bei
  384. der Verwendung von mehreren Sets von Serveroptionen ist es
  385. empfehlenswert, aber nicht notwendig, das die selbe
  386. <property>accountCanonicalForm</property> in allen
  387. Serveroptionen verwendet wird, sodas die sich ergebenden Benutzernamen
  388. immer auf die selbe Art und Weise kanonisiert werden (z.b. wenn man auf
  389. <filename>EXAMPLE\username</filename> mit einem AD Server kanonisiert,
  390. aber zu <filename>username@example.com</filename> mit einem OpenLDAP
  391. Server, kann das quirks für die High-Level Logik einer Anwendung sein).
  392. </entry>
  393. </row>
  394. <row>
  395. <entry><emphasis><property>accountDomainName</property></emphasis></entry>
  396. <entry>
  397. Der <acronym>FQDN</acronym> Domainname für welchen der Ziel
  398. <acronym>LDAP</acronym> Server eine Authorität ist (z.B.,
  399. <filename>example.com</filename>). Diese Option wird verwendet um Namen
  400. zu kanonisieren sodas der Benutzername der vom Benutzer angeboten wird,
  401. wie es für das Binden notwendig ist, konvertiert werden kann. Er wird
  402. auch verwendet um festzustellen ob der Server eine Authorität für den
  403. angegebenen Benutzernamen ist (z.B., wenn
  404. <property>accountDomainName</property> <filename>foo.net</filename> ist
  405. und der angegebene Benutzer <filename>bob@bar.net</filename>, wird der
  406. Server nicht abgefragt, und das Ergebnis wird ein Fehler sein). Diese
  407. Option wird nicht benötigt, aber wenn Sie nicht angegeben wird, dann
  408. werden Benutzernamen in prinzipieller Namensform (z.B.,
  409. <filename>alice@foo.net</filename>) nicht unterstützt. Es wird stark
  410. empfohlen das diese Option angegeben wird, da es viele Anwendungsfälle
  411. gibt welche die Erstellung von prinzipieller Namensform benötigen.
  412. </entry>
  413. </row>
  414. <row>
  415. <entry><emphasis><property>accountDomainNameShort</property></emphasis></entry>
  416. <entry>
  417. Die 'short' Domain für die der Ziel <acronym>LDAP</acronym> Server eine
  418. Authorität ist (z.B., <acronym>FOO</acronym>). Es ist z ubeachten das
  419. es ein 1:1 Mapping zwischen <property>accountDomainName</property> und
  420. <property>accountDomainNameShort</property> existiert. Diese
  421. Option sollte verwendet werden um den NetBIOS Domainnamen für Windows
  422. Netzwerke zu spezifizieren, kann aber auch von nicht-AD Servern
  423. verwendet werden (z.B., für Konsistenz bei mehreren Sets von
  424. Serveroptionen bei dem Schrägstrich Stil
  425. <property>accountCanonicalForm</property>). Diese Option wird nicht
  426. benötigt, aber wenn Sie nicht angegeben wird, werden Benutzernamen im
  427. Schrägstrich Stil (z.B. <filename>FOO\alice</filename>) nicht
  428. unterstützt.
  429. </entry>
  430. </row>
  431. <row>
  432. <entry><emphasis><property>accountFilterFormat</property></emphasis></entry>
  433. <entry>
  434. Der <acronym>LDAP</acronym> Suchfilter der für die Suche nach Accounts
  435. verwendet wird. Dieser String ist ein <ulink
  436. url="http://php.net/printf"><methodname>printf()</methodname></ulink>-Stil
  437. Ausdruck der ein '<emphasis>%s</emphasis>' enthalten muß um den
  438. Benutzernamen unterzubringen. Der Standardwert ist
  439. '<emphasis>(&amp;(objectClass=user)(sAMAccountName=%s))</emphasis>',
  440. ausgenommen <property>bindRequiresDn</property> wird auf
  441. <constant>TRUE</constant> gesetzt. In diesem Fall ist der Standardwert
  442. '<emphasis>(&amp;(objectClass=posixAccount)(uid=%s))</emphasis>'. Wenn,
  443. zum Beispiel, aus irgendeinem Grund
  444. <emphasis>bindRequiresDn = true</emphasis> mit AD verwendet werden soll,
  445. muß <emphasis>accountFilterFormat =
  446. '(&amp;(objectClass=user)(sAMAccountName=%s))</emphasis>' gesetzt
  447. werden.
  448. </entry>
  449. </row>
  450. <row>
  451. <entry><emphasis><property>optReferrals</property></emphasis></entry>
  452. <entry>
  453. Wenn sie auf <constant>TRUE</constant> gesetzt wird, zeigt diese Option
  454. dem <acronym>LDAP</acronym> Client an, das Referenzen gefolgt werden
  455. soll. Der Standardwert ist <constant>FALSE</constant>.
  456. </entry>
  457. </row>
  458. </tbody>
  459. </tgroup>
  460. </table>
  461. <note>
  462. <para>
  463. Wenn <emphasis>useStartTls = <constant>TRUE</constant></emphasis> oder
  464. <emphasis>useSsl = <constant>TRUE</constant></emphasis> aktiviert ist, erzeugt der
  465. <acronym>LDAP</acronym> Client einen Fehler der aussagt das er das Zertifikat des
  466. Servers nicht überprüfen kann. Angenommen die <acronym>PHP</acronym>
  467. <acronym>LDAP</acronym> Erweiterung ist ultimativ verlinkt mit der OpenLDAP Client
  468. Bibliothek, muß man um dieses Problem zu lösen
  469. "<command>TLS_REQCERT never</command>" im OpenLDAP Client
  470. <filename>ldap.conf</filename> setzen (und den Web Server restarten) um der
  471. OpenLDAP Client Bibliothek anzuzeigen das man dem Server vertraut. Alternativ,
  472. wenn man annimmt das der Server gehackt werden könnte kann das Basiszertifikat des
  473. <acronym>LDAP</acronym> Servers exportiert und auf den Webserver gegeben werden so
  474. dass der OpenLDAP Client die Identität des Servers prüfen kann.
  475. </para>
  476. </note>
  477. </sect2>
  478. <sect2 id="zend.auth.adapter.ldap.debugging">
  479. <title>Debug Nachrichten sammeln</title>
  480. <para>
  481. <classname>Zend_Auth_Adapter_Ldap</classname> sammelt Debug Informationen in seiner
  482. <methodname>authenticate()</methodname> Methode. Diese Information wird im
  483. <classname>Zend_Auth_Result</classname> Objekt als Nachrichten gespeichert. Das von
  484. <methodname>Zend_Auth_Result::getMessages()</methodname> zurückgegebene Array kann wie
  485. folgt beschrieben werden:
  486. </para>
  487. <table id="zend.auth.adapter.ldap.debugging.table">
  488. <title>Debug Nachrichten</title>
  489. <tgroup cols="2">
  490. <thead>
  491. <row>
  492. <entry>Array Index der Nachricht</entry>
  493. <entry>Beschreibung</entry>
  494. </row>
  495. </thead>
  496. <tbody>
  497. <row>
  498. <entry>Index 0</entry>
  499. <entry>
  500. Eine generelle, Benutzerfreundliche Meldung die für die Anzeige für
  501. Benutzer passt (z.B. "Ungültige Anmeldedaten"). Wenn die
  502. Authentifizierung erfolgreich ist, dann ist dieser String leer.
  503. </entry>
  504. </row>
  505. <row>
  506. <entry>Index 1</entry>
  507. <entry>
  508. Eine detailiertere Fehlermeldung die nicht für die Anzeige für Benutzer
  509. hergenommen werden kann, die aber mitgeloggt werden sollte zum Vorteil
  510. des Server Operators. Wenn die Authentifizierung erfolgreich war, ist
  511. dieser String leer.
  512. </entry>
  513. </row>
  514. <row>
  515. <entry>Indezes 2 und höher</entry>
  516. <entry>Alle Logmeldungen in Reihenfolge starten bei Index 2.</entry>
  517. </row>
  518. </tbody>
  519. </tgroup>
  520. </table>
  521. <para>
  522. Aus der Praxis heraus sollte der Index 0 dem Benutzer angezeigt werden (z.B. bei
  523. Verwendung des FlashMessenger Helfers), Index 1 sollte geloggt werden und, wenn die
  524. Debugging Information gesammelt wird, sollten die Indezes 2 und höher auch geloggt
  525. werden (auch wenn die letzte Nachricht immer den String vom Index 1 enthält).
  526. </para>
  527. </sect2>
  528. <sect2 id="zend.auth.adapter.ldap.options-common-server-specific">
  529. <title>Übliche Optionen für spezielle Server</title>
  530. <sect3 id="zend.auth.adapter.ldap.options-common-server-specific.active-directory">
  531. <title>Optionen für Active Directory</title>
  532. <para>
  533. Für <acronym>ADS</acronym> sind die folgenden Optionen beachtenswert:
  534. </para>
  535. <table
  536. id="zend.auth.adapter.ldap.options-common-server-specific.active-directory.table">
  537. <title>Optionen für Active Directory</title>
  538. <tgroup cols="2">
  539. <thead>
  540. <row>
  541. <entry>Name</entry>
  542. <entry>Zusätzliche Notizen</entry>
  543. </row>
  544. </thead>
  545. <tbody>
  546. <row>
  547. <entry><emphasis><property>host</property></emphasis></entry>
  548. <entry>Wie bei allen Servern, wird diese Option benötigt.</entry>
  549. </row>
  550. <row>
  551. <entry><emphasis><property>useStartTls</property></emphasis></entry>
  552. <entry>
  553. Zum Zwecke der Sicherheit, sollte das <constant>TRUE</constant> sein
  554. wenn der Server das notwendige Zertifikat installiert hat.
  555. </entry>
  556. </row>
  557. <row>
  558. <entry><emphasis><property>useSsl</property></emphasis></entry>
  559. <entry>
  560. Möglicherweise als Alternative zu <emphasis>useStartTls</emphasis>
  561. zu verwenden (siehe davor).
  562. </entry>
  563. </row>
  564. <row>
  565. <entry><emphasis><property>baseDn</property></emphasis></entry>
  566. <entry>
  567. Wie bei allen Servern, wird diese Option benötigt. Standardmäßig
  568. platziert AD alle Benutzer Accounts unter dem
  569. <emphasis>Users</emphasis> Container (z.B.,
  570. <emphasis>CN=Users,DC=foo,DC=net</emphasis>), aber der Standard ist
  571. in größeren Organisationen nicht üblich. Der AD Administrator sollte
  572. nach der besten DN für Accounts für die eigene Anwendung gefragt
  573. werden.
  574. </entry>
  575. </row>
  576. <row>
  577. <entry><emphasis><property>accountCanonicalForm</property></emphasis></entry>
  578. <entry>
  579. Das wird man normalerweise für Schrägstrich-Stil Namen auf 3 stellen
  580. (z.B., <filename>FOO\alice</filename>), was für Windows Benutzer am
  581. bekanntesten ist. Man sollte <emphasis>nicht</emphasis> die
  582. unqualifizierte Form 2 verwenden (z.B., <emphasis>alice</emphasis>),
  583. da das anderen Benutzern Zugriff auf die Anwendung geben würde, wenn
  584. Sie den gleichen Benutzernamen in anderen vertrauten Domains haben
  585. (z.B., <filename>BAR\alice</filename> und
  586. <filename>FOO\alice</filename> würden als der gleiche Benutzer
  587. behandelt). (siehe auch die Notiz anbei.)
  588. </entry>
  589. </row>
  590. <row>
  591. <entry><emphasis><property>accountDomainName</property></emphasis></entry>
  592. <entry>
  593. Das wird mit AD benötigt, ausser
  594. <property>accountCanonicalForm</property> 2 wird
  595. verwendet, was wiederum nicht eingesetzt werden sollte.
  596. </entry>
  597. </row>
  598. <row>
  599. <entry><emphasis><property>accountDomainNameShort</property></emphasis></entry>
  600. <entry>
  601. Der NetBIOS Name der Domain in der die Benutzer sind und für den der
  602. AD Server die Authorität ist. Das wird benötigt wenn der
  603. Schrägstrich-Stil <property>accountCanonicalForm</property>
  604. verwendet wird.
  605. </entry>
  606. </row>
  607. </tbody>
  608. </tgroup>
  609. </table>
  610. <note>
  611. <para>
  612. Technisch sollte es keine Probleme mit irrtümlichen Domain-übergreifenden
  613. Authentifizierungen mit der aktuellen
  614. <classname>Zend_Auth_Adapter_Ldap</classname> Implementation geben, da
  615. Serverdomains explizit geprüft werden, aber das muss für zukünftige
  616. Implementationen, welche die Domain während der Laufzeit ermitteln, nicht wahr
  617. sein, oder auch wenn ein alternativer Adapter verwendet wird (z.B., Kerberos).
  618. Generell ist bekannt das die Mehrdeutigkeit von Accountnamen ein
  619. Sicherheitsproblem ist. Man sollte deswegen immer versuchen qualifizierte
  620. Accountnamen zu verwenden.
  621. </para>
  622. </note>
  623. </sect3>
  624. <sect3 id="zend.auth.adapter.ldap.options-common-server-specific.openldap">
  625. <title>Optionen für OpenLDAP</title>
  626. <para>
  627. Für OpenLDAP oder einen generellen <acronym>LDAP</acronym> Server der ein typisches
  628. posixAccount Stil Schema verwendet sind die folgenden Optionen beachtenswert:
  629. </para>
  630. <table id="zend.auth.adapter.ldap.options-common-server-specific.openldap.table">
  631. <title>Optionen für OpenLDAP</title>
  632. <tgroup cols="2">
  633. <thead>
  634. <row>
  635. <entry>Name</entry>
  636. <entry>Zusätzliche Notizen</entry>
  637. </row>
  638. </thead>
  639. <tbody>
  640. <row>
  641. <entry><emphasis><property>host</property></emphasis></entry>
  642. <entry>Wie bei allen Servern, wird diese Option benötigt.</entry>
  643. </row>
  644. <row>
  645. <entry><emphasis><property>useStartTls</property></emphasis></entry>
  646. <entry>
  647. Zum Zwecke der Sicherheit, sollte das <constant>TRUE</constant> sein
  648. wenn der Server das notwendige Zertifikat installiert hat.
  649. </entry>
  650. </row>
  651. <row>
  652. <entry><emphasis><property>useSsl</property></emphasis></entry>
  653. <entry>
  654. Möglicherweise als Alternative zu <property>useStartTls</property>
  655. zu verwenden (siehe davor).
  656. </entry>
  657. </row>
  658. <row>
  659. <entry><emphasis><property>username</property></emphasis></entry>
  660. <entry>
  661. Benötigt und muß ein DN sein, da OpenLDAP den Benutzernamen in DN
  662. Form benötigt wenn ein Binden durchgeführt wird. Es sollte versucht
  663. werden einen nicht privilegierten Account zu verwenden.
  664. </entry>
  665. </row>
  666. <row>
  667. <entry><emphasis><property>password</property></emphasis></entry>
  668. <entry>
  669. Das Passwort das zum Benutzernamen von oben gehört. Es kann aber
  670. unterdrückt werden wenn der <acronym>LDAP</acronym> Server anonymes
  671. Binden bei Abfragen zu Benutzer Accounts erlaubt.
  672. </entry>
  673. </row>
  674. <row>
  675. <entry><emphasis><property>bindRequiresDn</property></emphasis></entry>
  676. <entry>
  677. Benötigt und muß <constant>TRUE</constant> sein, da OpenLDAP den
  678. Benutzernamen in DN Form benötigt wenn ein Binden durchgeführt wird.
  679. </entry>
  680. </row>
  681. <row>
  682. <entry><emphasis><property>baseDn</property></emphasis></entry>
  683. <entry>
  684. Wie bei allen Servern, wird diese Option benötigt und zeigt den DN
  685. in dem alle Accounts die authentifiziert werden enthalten sind.
  686. </entry>
  687. </row>
  688. <row>
  689. <entry><emphasis><property>accountCanonicalForm</property></emphasis></entry>
  690. <entry>
  691. Optional, aber der Standardwert ist 4 (prinzipielle-Stil Namen wie
  692. <filename>alice@foo.net</filename>) und könnte für die Benutzer
  693. nicht ideal sein wenn diese Schrägstrich-Stil Namen verwendetn
  694. (z.B., <filename>FOO\alice</filename>). Für Schrägstrich-Stil Namen
  695. sollte der Wert 3 verwendet werden.
  696. </entry>
  697. </row>
  698. <row>
  699. <entry><emphasis><property>accountDomainName</property></emphasis></entry>
  700. <entry>
  701. Benötigt es sei denn man verwendet
  702. <property>accountCanonicalForm</property> 2, was nicht
  703. zu empfehlen ist.
  704. </entry>
  705. </row>
  706. <row>
  707. <entry><emphasis><property>accountDomainNameShort</property></emphasis></entry>
  708. <entry>
  709. Wenn AD auch nicht verwendet wird, wird dieser Wert nicht benötigt.
  710. Andernfalls, wenn
  711. <property>accountCanonicalForm</property> 3 verwendet
  712. wird, wird diese Option benötigt und sollte ein Kurzname sein der
  713. adäquat zu <property>accountDomainName</property>
  714. korrespondiert (z.B., wenn
  715. <property>accountDomainName</property>
  716. <filename>foo.net</filename> ist, wäre ein guter
  717. <property>accountDomainNameShort</property> Wert
  718. <acronym>FOO</acronym>).
  719. </entry>
  720. </row>
  721. </tbody>
  722. </tgroup>
  723. </table>
  724. </sect3>
  725. </sect2>
  726. </sect1>