Zend_Auth_Adapter_Ldap.xml 40 KB

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