Zend_Auth_Adapter_Ldap.xml 43 KB

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