Zend_Auth_Adapter_Ldap.xml 40 KB

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