Zend_Auth_Adapter_Ldap.xml 41 KB

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