Zend_Auth_Adapter_Ldap.xml 41 KB

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