Zend_Auth_Adapter_Ldap.xml 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20763 -->
  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>
  10. unterstützt Webanwendungen bei der
  11. Authentifizierung mit
  12. <acronym>LDAP</acronym>
  13. Services. Die Features beinhalten
  14. Kanonisierung von Benutzernamen und Domainnamen, Mehrfach-Domain
  15. Authentifizierung, und
  16. Fehlerbehandlungs Features. Es wurde getestet mit
  17. <ulink
  18. url="http://www.microsoft.com/windowsserver2003/technologies/directory/activedirectory/">Microsoft
  19. Active Directory</ulink>
  20. und
  21. <ulink url="http://www.openldap.org/">OpenLDAP</ulink>
  22. ,
  23. sollte auch mit anderen
  24. <acronym>LDAP</acronym>
  25. Service Provider zusammenarbeiten.
  26. </para>
  27. <para>
  28. Diese Dokumentation enthält eine Anleitung der Verwendung von
  29. <classname>Zend_Auth_Adapter_Ldap</classname>
  30. , eine Beschreibung der
  31. <acronym>API</acronym>
  32. , eine Ausgabe der verschiedenen Optionen, Diagnostische
  33. Informationen für die Fehlerbehandlung bei Authentifizierungs
  34. Problemen, und Beispiel
  35. Optionen für beide, Active Directory und OpenLDAP Server.
  36. </para>
  37. </sect2>
  38. <sect2 id="zend.auth.adapter.ldap.usage">
  39. <title>Verwendung</title>
  40. <para>
  41. Um
  42. <classname>Zend_Auth_Adapter_Ldap</classname>
  43. Authentifizierung in eigene Anwendungen
  44. schnell einzubauen, selbst wenn
  45. <classname>Zend_Controller</classname>
  46. nicht verwendet
  47. wird, sollte das Fleisch des eigenen Codes in etwa wie folgt aussehen:
  48. </para>
  49. <programlisting language="php"><![CDATA[
  50. $username = $this->_request->getParam('username');
  51. $password = $this->_request->getParam('password');
  52. $auth = Zend_Auth::getInstance();
  53. $config = new Zend_Config_Ini('../application/config/config.ini',
  54. 'production');
  55. $log_path = $config->ldap->log_path;
  56. $options = $config->ldap->toArray();
  57. unset($options['log_path']);
  58. $adapter = new Zend_Auth_Adapter_Ldap($options, $username,
  59. $password);
  60. $result = $auth->authenticate($adapter);
  61. if ($log_path) {
  62. $messages = $result->getMessages();
  63. $logger = new Zend_Log();
  64. $logger->addWriter(new Zend_Log_Writer_Stream($log_path));
  65. $filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG);
  66. $logger->addFilter($filter);
  67. foreach ($messages as $i => $message) {
  68. if ($i-- > 1) { // $messages[2] und höher sind Log Nachrichten
  69. $message = str_replace("\n", "\n ", $message);
  70. $logger->log("Ldap: $i: $message", Zend_Log::DEBUG);
  71. }
  72. }
  73. }
  74. ]]></programlisting>
  75. <para>
  76. Natürlich ist der Logging Code optional, aber es wird dringend
  77. empfohlen einen Logger
  78. zu verwenden.
  79. <classname>Zend_Auth_Adapter_Ldap</classname>
  80. zeichnet fast jedes
  81. Bisschen an Information in
  82. <varname>$messages</varname>
  83. auf das irgendwer benötigen
  84. können (mehr anbei), was allerdings selbst ein nettes Feature für jemanden
  85. als History
  86. ist, kann überaus schwierig zu debuggen sein.
  87. </para>
  88. <para>
  89. Der
  90. <classname>Zend_Config_Ini</classname>
  91. wird oben verwendet um die Optionen des
  92. Adapters zu laden. Er ist also auch optional. Ein reguläres Array würde
  93. genauso gut
  94. arbeiten. Das folgende ist eine Beispiel
  95. <filename>application/config/config.ini</filename>
  96. Datei die Optionen für zwei separate
  97. Server hat. Mit mehreren Sets von Server Optionen versucht der Adapter jede
  98. in
  99. Reihenfolge bis die Zugangsdaten erfolgreich authentifiziert wurden. Die Namen
  100. der
  101. Server (z.B., 'server1' und 'server2') sind sehr verallgemeinert. Für
  102. Details
  103. betreffend dem Array für Optionen, siehe das Kapitel über
  104. <emphasis>Server
  105. Optionen</emphasis>
  106. weiter unten. Es ist zu beachten das
  107. <classname>Zend_Config_Ini</classname>
  108. jeden Wert der mit Gleichheitszeichen
  109. (
  110. <emphasis>=</emphasis>
  111. ) geschrieben wird auch unter Anführungszeichen gesetzt wird
  112. (wie unten bei DNs gezeigt).
  113. </para>
  114. <programlisting language="ini"><![CDATA[
  115. [production]
  116. ldap.log_path = /tmp/ldap.log
  117. ; Typische Optionen für OpenLDAP
  118. ldap.server1.host = s0.foo.net
  119. ldap.server1.accountDomainName = foo.net
  120. ldap.server1.accountDomainNameShort = FOO
  121. ldap.server1.accountCanonicalForm = 3
  122. ldap.server1.username = "CN=user1,DC=foo,DC=net"
  123. ldap.server1.password = pass1
  124. ldap.server1.baseDn = "OU=Sales,DC=foo,DC=net"
  125. ldap.server1.bindRequiresDn = true
  126. ; Typische Optionen für Active Directory
  127. ldap.server2.host = dc1.w.net
  128. ldap.server2.useStartTls = true
  129. ldap.server2.accountDomainName = w.net
  130. ldap.server2.accountDomainNameShort = W
  131. ldap.server2.accountCanonicalForm = 3
  132. ldap.server2.baseDn = "CN=Users,DC=w,DC=net"
  133. ]]></programlisting>
  134. <para>
  135. Die obige Konfiguration instruiert
  136. <classname>Zend_Auth_Adapter_Ldap</classname>
  137. das es
  138. versuchen soll Benutzer zuerst mit dem OpenLDAP Server
  139. <filename>s0.foo.net</filename>
  140. authentifizieren soll. Wenn die Authentifizierung auf irgendeinem
  141. Grund fehlschlägt,
  142. wird der AD Server
  143. <filename>dc1.w.net</filename>
  144. versucht.
  145. </para>
  146. <para>
  147. Mit Servern in verschiedenen Domains, zeigt diese Konfiguration
  148. Multi-Domain
  149. Authentifizierung. Es können auch mehrere Server in der gleichen Domain sein um
  150. Redundanz anzubieten.
  151. </para>
  152. <para>
  153. In diesem Fall ist zu beachten das, selbst wenn OpenLDAP keine
  154. Notwendigkeit für kurze
  155. NetBIOS Stil Domainnamen hat die von Windows verwendet werden bieten wir Sie
  156. hier an
  157. wegen der Kanonifizierung der Namen (beschrieben im
  158. <emphasis>Kanonifizierung von Benutzernamen</emphasis>
  159. Kapitel anbei).
  160. </para>
  161. </sect2>
  162. <sect2 id="zend.auth.adapter.ldap.api">
  163. <title>Die API</title>
  164. <para>
  165. Der
  166. <classname>Zend_Auth_Adapter_Ldap</classname>
  167. Konstruktor akzeptiert drei Parameter.
  168. </para>
  169. <para>
  170. Der
  171. <varname>$options</varname>
  172. Parameter wird benötigt und muß ein Array sein das ein
  173. oder mehrere Sets von Optionen enthält. Es ist zu beachten das es sich um
  174. <emphasis>Array von Arrays</emphasis>
  175. von
  176. <link linkend="zend.ldap">
  177. <classname>Zend_Ldap</classname>
  178. </link>
  179. Optionen handelt. Selbst
  180. wenn nur ein einzelner
  181. <acronym>LDAP</acronym>
  182. Server verwendet wird, müssen die
  183. Optionen trotzdem in einem anderen Array sein.
  184. </para>
  185. <para>
  186. Anbei ist eine
  187. <ulink url="http://php.net/print_r">
  188. <methodname>print_r()</methodname>
  189. </ulink>
  190. Ausgabe von beispielhaften Optionsparameters die zwei Sets von
  191. Serveroptionen für
  192. <acronym>LDAP</acronym>
  193. Server enthalten,
  194. <filename>s0.foo.net</filename>
  195. und
  196. <filename>dc1.w.net</filename>
  197. (die gleichen Optionen wie in der oberen
  198. <acronym>INI</acronym>
  199. Repräsentation):
  200. </para>
  201. <programlisting language="output"><![CDATA[
  202. Array
  203. (
  204. [server2] => Array
  205. (
  206. [host] => dc1.w.net
  207. [useStartTls] => 1
  208. [accountDomainName] => w.net
  209. [accountDomainNameShort] => W
  210. [accountCanonicalForm] => 3
  211. [baseDn] => CN=Users,DC=w,DC=net
  212. )
  213. [server1] => Array
  214. (
  215. [host] => s0.foo.net
  216. [accountDomainName] => foo.net
  217. [accountDomainNameShort] => FOO
  218. [accountCanonicalForm] => 3
  219. [username] => CN=user1,DC=foo,DC=net
  220. [password] => pass1
  221. [baseDn] => OU=Sales,DC=foo,DC=net
  222. [bindRequiresDn] => 1
  223. )
  224. )
  225. ]]></programlisting>
  226. <para>
  227. Die oben angebotene Information in jedem Set von Optionen ist
  228. hauptsächlich deswegen
  229. unterschiedlich weil AD keinen Benutzernamen während des Bindesn in der DN Form
  230. benötigt
  231. (siehe die
  232. <property>bindRequiresDn</property>
  233. Option des
  234. <emphasis>Server Optionen</emphasis>
  235. Kapitels weiter unten), was bedeutet das die
  236. Anzahl der, mit dem Empfangen der DN, für einen Benutzernamen der
  237. Authentifiziert
  238. werden soll, assoziierten Optionen, unterdrückt werden kann.
  239. </para>
  240. <note>
  241. <title>Was ist ein ausgezeichneter Name?</title>
  242. <para>
  243. Ein DN oder "distinguished name" ist ein String der den Pfad zu
  244. einem Objekt im
  245. <acronym>LDAP</acronym>
  246. Verzeichnis repräsentiert. Jede komma-seperierte Komponente
  247. ist ein Attribut und Wert der einen Node repräsentiert. Die Komponenten
  248. werden
  249. rückwirkend evaluiert. Zum Beispiel ist der Benutzeraccount
  250. <emphasis>CN=Bob Carter,CN=Users,DC=w,DC=net</emphasis>
  251. direkt in
  252. <emphasis>CN=Users,DC=w,DC=net container</emphasis>
  253. enthalten. Diese Struktur wird
  254. am besten mit einem
  255. <acronym>LDAP</acronym>
  256. Browser wie das
  257. <acronym>ADSI</acronym>
  258. Edit
  259. <acronym>MMC</acronym>
  260. snap-in für Active Directory oder phpLDAPadmin erkundet.
  261. </para>
  262. </note>
  263. <para>
  264. Die Namen von Servern (z.B. 'server1' und 'server2' wie unten
  265. gezeigt) sind großteils
  266. beliebig, aber aus Gründen der Verwendung von
  267. <classname>Zend_Config</classname>
  268. sollten die Identifikatoren (im Gegensatz dazu das Sie nummerische
  269. Indezes sind)
  270. vorhanden sein, und sollten keine spezielle Zeichen enthalten die vom
  271. assoziierten
  272. Dateiformat verwendet werden (z.B. der '
  273. <emphasis>.</emphasis>
  274. '
  275. <acronym>INI</acronym>
  276. Eigenschafts Separator, '
  277. <emphasis>&amp;</emphasis>
  278. ' für
  279. <acronym>XML</acronym>
  280. Entity
  281. Referenzen, usw.).
  282. </para>
  283. <para>
  284. Mit mehreren Sets von Serveroptionen, kann der Adapter Benutzer in
  285. mehreren Domains
  286. authentifizieren und bietet ein Failover damit, wenn ein Server nicht erreichbar ist,
  287. ein anderer abgefragt wird.
  288. </para>
  289. <note>
  290. <title>Die glorreichen Details: Was passiert bei der
  291. Authentifizierungs Methode?</title>
  292. <para>
  293. Wenn die
  294. <methodname>authenticate()</methodname>
  295. Methode aufgerufen wird, iteriert
  296. der Adapter über jedes Set von Serveroptione, setzt diese auf der
  297. internen
  298. <classname>Zend_Ldap</classname>
  299. Instanz und ruft die
  300. <methodname>Zend_Ldap::bind()</methodname>
  301. Methode, mit dem Benutzernamen und
  302. Passwort das authentifiziert werden soll, auf. Die
  303. <classname>Zend_Ldap</classname>
  304. Klasse prüft um zu sehen ob der Benutzer mit einer Domain
  305. qualifiziert ist (hat
  306. z.B. eine Domainkomponente wie
  307. <filename>alice@foo.net</filename>
  308. oder
  309. <filename>FOO\alice</filename>
  310. ). Wenn eine Domain vorhanden ist, aber mit keiner
  311. der Domainnamen der Server (
  312. <filename>foo.net</filename>
  313. oder
  314. <acronym>FOO</acronym>
  315. ) übereinstimmt, wird eine spezielle Ausnahme geworfen und
  316. durch
  317. <classname>Zend_Auth_Adapter_Ldap</classname>
  318. gefangen, was bewirkt das der
  319. Server ignoriert wird und der nächste, in den Serveroptionen gesetzte
  320. Server,
  321. ausgewählt wird. Wenn eine Domain
  322. <emphasis>doch</emphasis>
  323. passt, oder der
  324. Benutzer keinen qualifizierten Benutzernamen angegeben hat, fährt
  325. <classname>Zend_Ldap</classname>
  326. weiter fort und versucht mit den angegebenen
  327. Zugangsdaten zu binden. Wenn das Binden nicht erfolgreich war wirft
  328. <classname>Zend_Ldap</classname>
  329. eine
  330. <classname>Zend_Ldap_Exception</classname>
  331. welche durch
  332. <classname>Zend_Auth_Adapter_Ldap</classname>
  333. gefangen wird, und das
  334. nächste Set von Serveroptionen wird versucht. Wenn das Binden erfolgreich
  335. war, wird
  336. die Iteration gestoppt, und die
  337. <methodname>authenticate()</methodname>
  338. Methode des
  339. Adapters gibt ein erfolgreiches Ergebnis zurück. Wenn alle Serveroptionen
  340. ohne
  341. Erfolg durchprobiert wurden, schlägt die Authentifizierung fehl, und
  342. <methodname>authenticate()</methodname>
  343. gibt ein Fehlerergebnis zurück mit der
  344. Fehlermeldung der letzten Iteration.
  345. </para>
  346. </note>
  347. <para>
  348. Die username und password Parameter des
  349. <classname>Zend_Auth_Adapter_Ldap</classname>
  350. Konstruktors repräsentieren die Zugangsdaten die authentifiziert
  351. werden sollen (z.B.
  352. die Zugangsdaten die durch den Benutzer über eine
  353. <acronym>HTML</acronym>
  354. Login Form
  355. angegeben werden). Alternativ können Sie auch mit den
  356. <methodname>setUsername()</methodname>
  357. und
  358. <methodname>setPassword()</methodname>
  359. Methoden gesetzt werden.
  360. </para>
  361. </sect2>
  362. <sect2 id="zend.auth.adapter.ldap.server-options">
  363. <title>Server Optionen</title>
  364. <para>
  365. Jedes Set von Serveroptionen
  366. <emphasis>
  367. im Kontext von
  368. <classname>Zend_Auth_Adapter_Ldap</classname>
  369. </emphasis>
  370. besteht aus den folgenden
  371. Optionen welche, großteils ungeändert, an
  372. <methodname>Zend_Ldap::setOptions()</methodname>
  373. übergeben werden:
  374. </para>
  375. <table id="zend.auth.adapter.ldap.server-options.table">
  376. <title>Server Optionen</title>
  377. <tgroup cols="2">
  378. <thead>
  379. <row>
  380. <entry>Name</entry>
  381. <entry>Beschreibung</entry>
  382. </row>
  383. </thead>
  384. <tbody>
  385. <row>
  386. <entry>
  387. <emphasis>
  388. <property>host</property>
  389. </emphasis>
  390. </entry>
  391. <entry>
  392. Der Hostname des
  393. <acronym>LDAP</acronym>
  394. Servers der diese Optionen
  395. repräsentiert. Diese Option wird benötigt.
  396. </entry>
  397. </row>
  398. <row>
  399. <entry>
  400. <emphasis>
  401. <property>port</property>
  402. </emphasis>
  403. </entry>
  404. <entry>
  405. Der Port auf den der
  406. <acronym>LDAP</acronym>
  407. Server schaut. Wenn
  408. <emphasis>useSsl</emphasis>
  409. <constant>TRUE</constant>
  410. ist, ist der
  411. Standardwert von
  412. <property>port</property>
  413. 636. Wenn
  414. <property>useSsl</property>
  415. <constant>FALSE</constant>
  416. ist, ist der
  417. Standardwert von
  418. <property>port</property>
  419. 389.
  420. </entry>
  421. </row>
  422. <row>
  423. <entry>
  424. <emphasis>
  425. <property>useStartTls</property>
  426. </emphasis>
  427. </entry>
  428. <entry>
  429. Ob der
  430. <acronym>LDAP</acronym>
  431. Client einen
  432. <acronym>TSL</acronym>
  433. (aka
  434. <acronym>SSL</acronym>
  435. v2) verschlüsselten Transport verwenden soll oder
  436. nicht. Der Wert
  437. <constant>TRUE</constant>
  438. wird in einer
  439. Produktionsumgebung strengstens empfohlen um zu verhindern das
  440. Passwörter im Klartext übertragen werden. Der Standardwert ist
  441. <constant>FALSE</constant>
  442. , da Server typischerweise nach deren
  443. Installation erwarten das ein Zertifikat installiert wird. Die
  444. <property>useSsl</property>
  445. und
  446. <property>useStartTls</property>
  447. Optionen schließen sich gegenseitig aus. Die
  448. <property>useStartTls</property>
  449. Option sollte über
  450. <property>useSsl</property>
  451. favorisiert werden, aber nicht alle Server
  452. unterstützen diesen neueren Mechanismus.
  453. </entry>
  454. </row>
  455. <row>
  456. <entry>
  457. <emphasis>
  458. <property>useSsl</property>
  459. </emphasis>
  460. </entry>
  461. <entry>
  462. Ob der
  463. <acronym>LDAP</acronym>
  464. Client einen
  465. <acronym>SSL</acronym>
  466. verschlüsselten Transport verwenden soll. Die
  467. <property>useSsl</property>
  468. und
  469. <property>useStartTls</property>
  470. Optionen schließen sich gegenseitig aus, aber
  471. <property>useStartTls</property>
  472. sollte favorisiert werden wenn der
  473. Server und die
  474. <acronym>LDAP</acronym>
  475. Bibliothek des Clients diese
  476. unterstützen. Dieser Wert ändert auch den Standardwert von
  477. <property>port</property>
  478. (siehe die
  479. <property>port</property>
  480. Beschreibung weiter oben).
  481. </entry>
  482. </row>
  483. <row>
  484. <entry>
  485. <emphasis>
  486. <property>username</property>
  487. </emphasis>
  488. </entry>
  489. <entry>
  490. Der DN des Accounts der verwendet wird um DN Account Loopups
  491. durchzuführen.
  492. <acronym>LDAP</acronym>
  493. Server die den Benutzernamen
  494. in DN Form benötigen wenn "bind" durchgeführt wird, benötigen diese
  495. Option. Wenn
  496. <property>bindRequiresDn</property>
  497. <constant>TRUE</constant>
  498. ist, wird diese Option benötigt. Dieser
  499. Account muß kein privilegierter Account sein - ein Account mit nur-lese
  500. Zugriff zu Objekten unter
  501. <property>baseDn</property>
  502. ist alles was
  503. notwendig ist (und bevorzugt unter dem
  504. <emphasis>Prinzip des geringsten
  505. Privilegs</emphasis>
  506. ).
  507. </entry>
  508. </row>
  509. <row>
  510. <entry>
  511. <emphasis>
  512. <property>password</property>
  513. </emphasis>
  514. </entry>
  515. <entry>
  516. Das Passwort des Accounts der verwendet wird um DN Lookups
  517. durchzuführen. Wenn diese Option nicht unterstützt wird, versucht
  518. der
  519. <acronym>LDAP</acronym>
  520. Client einen "anonymen bind" wenn DN Lookups
  521. durchgeführt werden.
  522. </entry>
  523. </row>
  524. <row>
  525. <entry>
  526. <emphasis>
  527. <property>bindRequiresDn</property>
  528. </emphasis>
  529. </entry>
  530. <entry>
  531. Einige
  532. <acronym>LDAP</acronym>
  533. Server benötigen den zum Binden
  534. verwendeten Benutzernamen in der DN Form wie
  535. <emphasis>CN=Alice Baker,OU=Sales,DC=foo,DC=net</emphasis>
  536. (grundsätzlich alle Server
  537. <emphasis>außer</emphasis>
  538. AD). Wenn diese
  539. Option
  540. <constant>TRUE</constant>
  541. ist, instuiert dies
  542. <classname>Zend_Ldap</classname>
  543. das der DN automatisch empfangen wird,
  544. abhängig vom Benutzernamen der authentifiziert wird, wenn er nicht
  545. bereits in DN Form ist, und diesen dann wieder mit der richtigen
  546. DN zu
  547. binden. Der Standardwert ist
  548. <constant>FALSE</constant>
  549. . Aktuell ist nur
  550. von Microsoft Active Directory Server (
  551. <acronym>ADS</acronym>
  552. ) bekannt
  553. das es den Benutzernamen
  554. <emphasis>nicht</emphasis>
  555. in der DN Form
  556. benötigt wenn gebunden wird, und deswegen kann diese Option mit AD auch
  557. <constant>FALSE</constant>
  558. sein (und sollte das auch, da das Empfangen
  559. des DN eine extra Anfrage zum Server benötigt). Andernfalls muß
  560. diese
  561. Option auf
  562. <constant>TRUE</constant>
  563. gesetzt werden (z.B. für OpenLDAP).
  564. Diese Option kontrolliert das Standard
  565. <property>acountFilterFormat</property>
  566. das verwendet wird wenn nach
  567. Accounts gesucht wird. Siehe auch die
  568. <property>accountFilterFormat</property>
  569. Option.
  570. </entry>
  571. </row>
  572. <row>
  573. <entry>
  574. <emphasis>
  575. <property>baseDn</property>
  576. </emphasis>
  577. </entry>
  578. <entry>
  579. Der Ort vom DN unter dem alle Accounts die authentifiziert
  580. werden. Diese
  581. Option wird benötigt. Wenn man sich unsicher über den richtigen
  582. <property>baseDn</property>
  583. ist, sollte es genug sein Ihn von
  584. der
  585. <acronym>DNS</acronym>
  586. Domain des Benutzers der die
  587. <emphasis>DC=</emphasis>
  588. Komponenten verwedet abzuleiten. Wenn der
  589. Hauptname eines Benutzers
  590. <filename>alice@foo.net</filename>
  591. ist, sollte
  592. ein
  593. <property>baseDn</property>
  594. von
  595. <emphasis>DC=foo,DC=net</emphasis>
  596. funktionieren. Eine präzisere Ortsangabe
  597. (z.B.
  598. <emphasis>OU=Sales,DC=foo,DC=net</emphasis>
  599. ) ist trotzdem
  600. effizienter.
  601. </entry>
  602. </row>
  603. <row>
  604. <entry>
  605. <emphasis>
  606. <property>accountCanonicalForm</property>
  607. </emphasis>
  608. </entry>
  609. <entry>
  610. Ein Wert von 2, 3 oder 4 zeigt die Form zu der Account Namen
  611. authorisiert werden sollten nachdem die Authentifizierung
  612. erfolgreich
  613. war. Die Werte sind wie folgt: 2 für traditionelle Benutzernamen-Stil
  614. Namen (z.B.,
  615. <emphasis>alice</emphasis>
  616. ), 3 für Schrägstrich-Stil Namen
  617. (z.B.,
  618. <filename>FOO\alice</filename>
  619. ) oder 4 für Authentifiziert-Sil
  620. Namen (z.B.,
  621. <filename>alice@foo.net</filename>
  622. ). Der Standardwert ist 4
  623. (z.B.,
  624. <filename>alice@foo.net</filename>
  625. ). Mit einem Wert von 3, z.B.,
  626. wird die Identität die von
  627. <methodname>Zend_Auth_Result::getIdentity()</methodname>
  628. zurückgegeben
  629. wird (und
  630. <methodname>Zend_Auth::getIdentity()</methodname>
  631. , wenn
  632. <classname>Zend_Auth</classname>
  633. verwendet wird), immer
  634. <filename>FOO\alice</filename>
  635. sein, unabhängig von der Form in der
  636. Alice angegeben wurde, egal ob es
  637. <emphasis>alice</emphasis>
  638. ,
  639. <filename>alice@foo.net</filename>
  640. ,
  641. <filename>FOO\alice</filename>
  642. ,
  643. <filename>FoO\aLicE</filename>
  644. ,
  645. <filename>foo.net\alice</filename>
  646. , etc.
  647. Siehe das Kapitel
  648. <emphasis>Kanonisierung von Account Namen</emphasis>
  649. in der
  650. <classname>Zend_Ldap</classname>
  651. Dokumentation für Details. Bei
  652. der Verwendung von mehreren Sets von Serveroptionen ist es
  653. empfehlenswert, aber nicht notwendig, das die selbe
  654. <property>accountCanonicalForm</property>
  655. in allen
  656. Serveroptionen verwendet wird, sodas die sich ergebenden Benutzernamen
  657. immer auf die selbe Art und Weise kanonisiert werden (z.b. wenn man
  658. auf
  659. <filename>EXAMPLE\username</filename>
  660. mit einem AD Server kanonisiert,
  661. aber zu
  662. <filename>username@example.com</filename>
  663. mit einem OpenLDAP
  664. Server, kann das quirks für die High-Level Logik einer Anwendung sein).
  665. </entry>
  666. </row>
  667. <row>
  668. <entry>
  669. <emphasis>
  670. <property>accountDomainName</property>
  671. </emphasis>
  672. </entry>
  673. <entry>
  674. Der
  675. <acronym>FQDN</acronym>
  676. Domainname für welchen der Ziel
  677. <acronym>LDAP</acronym>
  678. Server eine Authorität ist (z.B.,
  679. <filename>example.com</filename>
  680. ). Diese Option wird verwendet um Namen
  681. zu kanonisieren sodas der Benutzername der vom Benutzer angeboten
  682. wird,
  683. wie es für das Binden notwendig ist, konvertiert werden kann. Er
  684. wird
  685. auch verwendet um festzustellen ob der Server eine Authorität für den
  686. angegebenen Benutzernamen ist (z.B., wenn
  687. <property>accountDomainName</property>
  688. <filename>foo.net</filename>
  689. ist
  690. und der angegebene Benutzer
  691. <filename>bob@bar.net</filename>
  692. , wird der
  693. Server nicht abgefragt, und das Ergebnis wird ein Fehler sein). Diese
  694. Option wird nicht benötigt, aber wenn Sie nicht angegeben wird,
  695. dann
  696. werden Benutzernamen in prinzipieller Namensform (z.B.,
  697. <filename>alice@foo.net</filename>
  698. ) nicht unterstützt. Es wird stark
  699. empfohlen das diese Option angegeben wird, da es viele Anwendungsfälle
  700. gibt welche die Erstellung von prinzipieller Namensform
  701. benötigen.
  702. </entry>
  703. </row>
  704. <row>
  705. <entry>
  706. <emphasis>
  707. <property>accountDomainNameShort</property>
  708. </emphasis>
  709. </entry>
  710. <entry>
  711. Die 'short' Domain für die der Ziel
  712. <acronym>LDAP</acronym>
  713. Server eine
  714. Authorität ist (z.B.,
  715. <acronym>FOO</acronym>
  716. ). Es ist z ubeachten das
  717. es ein 1:1 Mapping zwischen
  718. <property>accountDomainName</property>
  719. und
  720. <property>accountDomainNameShort</property>
  721. existiert. Diese
  722. Option sollte verwendet werden um den NetBIOS Domainnamen für Windows
  723. Netzwerke zu spezifizieren, kann aber auch von nicht-AD Servern
  724. verwendet werden (z.B., für Konsistenz bei mehreren Sets von
  725. Serveroptionen bei dem Schrägstrich Stil
  726. <property>accountCanonicalForm</property>
  727. ). Diese Option wird nicht
  728. benötigt, aber wenn Sie nicht angegeben wird, werden Benutzernamen im
  729. Schrägstrich Stil (z.B.
  730. <filename>FOO\alice</filename>
  731. ) nicht
  732. unterstützt.
  733. </entry>
  734. </row>
  735. <row>
  736. <entry>
  737. <emphasis>
  738. <property>accountFilterFormat</property>
  739. </emphasis>
  740. </entry>
  741. <entry>
  742. Der
  743. <acronym>LDAP</acronym>
  744. Suchfilter der für die Suche nach Accounts
  745. verwendet wird. Dieser String ist ein
  746. <ulink url="http://php.net/printf">
  747. <methodname>printf()</methodname>
  748. </ulink>
  749. -Stil
  750. Ausdruck der ein '
  751. <emphasis>%s</emphasis>
  752. ' enthalten muß um den
  753. Benutzernamen unterzubringen. Der Standardwert ist
  754. '
  755. <emphasis>(&amp;(objectClass=user)(sAMAccountName=%s))</emphasis>
  756. ',
  757. ausgenommen
  758. <property>bindRequiresDn</property>
  759. wird auf
  760. <constant>TRUE</constant>
  761. gesetzt. In diesem Fall ist der Standardwert
  762. '
  763. <emphasis>(&amp;(objectClass=posixAccount)(uid=%s))</emphasis>
  764. '. Wenn,
  765. zum Beispiel, aus irgendeinem Grund
  766. <emphasis>bindRequiresDn = true</emphasis>
  767. mit AD verwendet werden soll,
  768. muß
  769. <emphasis>accountFilterFormat =
  770. '(&amp;(objectClass=user)(sAMAccountName=%s))</emphasis>
  771. ' gesetzt
  772. werden.
  773. </entry>
  774. </row>
  775. <row>
  776. <entry>
  777. <emphasis>
  778. <property>optReferrals</property>
  779. </emphasis>
  780. </entry>
  781. <entry>
  782. Wenn sie auf
  783. <constant>TRUE</constant>
  784. gesetzt wird, zeigt diese Option
  785. dem
  786. <acronym>LDAP</acronym>
  787. Client an, das Referenzen gefolgt werden
  788. soll. Der Standardwert ist
  789. <constant>FALSE</constant>
  790. .
  791. </entry>
  792. </row>
  793. </tbody>
  794. </tgroup>
  795. </table>
  796. <note>
  797. <para>
  798. Wenn
  799. <emphasis>
  800. useStartTls =
  801. <constant>TRUE</constant>
  802. </emphasis>
  803. oder
  804. <emphasis>
  805. useSsl =
  806. <constant>TRUE</constant>
  807. </emphasis>
  808. aktiviert ist, erzeugt der
  809. <acronym>LDAP</acronym>
  810. Client einen Fehler der aussagt das er das Zertifikat des
  811. Servers nicht überprüfen kann. Angenommen die
  812. <acronym>PHP</acronym>
  813. <acronym>LDAP</acronym>
  814. Erweiterung ist ultimativ verlinkt mit der OpenLDAP Client
  815. Bibliothek, muß man um dieses Problem zu lösen
  816. "
  817. <command>TLS_REQCERT never</command>
  818. " im OpenLDAP Client
  819. <filename>ldap.conf</filename>
  820. setzen (und den Web Server restarten) um der
  821. OpenLDAP Client Bibliothek anzuzeigen das man dem Server vertraut.
  822. Alternativ,
  823. wenn man annimmt das der Server gehackt werden könnte kann das
  824. Basiszertifikat des
  825. <acronym>LDAP</acronym>
  826. Servers exportiert und auf den Webserver gegeben werden so
  827. dass der OpenLDAP Client die Identität des Servers prüfen kann.
  828. </para>
  829. </note>
  830. </sect2>
  831. <sect2 id="zend.auth.adapter.ldap.debugging">
  832. <title>Debug Nachrichten sammeln</title>
  833. <para>
  834. <classname>Zend_Auth_Adapter_Ldap</classname>
  835. sammelt Debug Informationen in seiner
  836. <methodname>authenticate()</methodname>
  837. Methode. Diese Information wird im
  838. <classname>Zend_Auth_Result</classname>
  839. Objekt als Nachrichten gespeichert. Das von
  840. <methodname>Zend_Auth_Result::getMessages()</methodname>
  841. zurückgegebene Array kann wie
  842. folgt beschrieben werden:
  843. </para>
  844. <table id="zend.auth.adapter.ldap.debugging.table">
  845. <title>Debug Nachrichten</title>
  846. <tgroup cols="2">
  847. <thead>
  848. <row>
  849. <entry>Array Index der Nachricht</entry>
  850. <entry>Beschreibung</entry>
  851. </row>
  852. </thead>
  853. <tbody>
  854. <row>
  855. <entry>Index 0</entry>
  856. <entry>
  857. Eine generelle, Benutzerfreundliche Meldung die für die Anzeige für
  858. Benutzer passt (z.B. "Ungültige Anmeldedaten"). Wenn die
  859. Authentifizierung erfolgreich ist, dann ist dieser String leer.
  860. </entry>
  861. </row>
  862. <row>
  863. <entry>Index 1</entry>
  864. <entry>
  865. Eine detailiertere Fehlermeldung die nicht für die Anzeige für
  866. Benutzer
  867. hergenommen werden kann, die aber mitgeloggt werden sollte zum Vorteil
  868. des Server Operators. Wenn die Authentifizierung erfolgreich war,
  869. ist
  870. dieser String leer.
  871. </entry>
  872. </row>
  873. <row>
  874. <entry>Indezes 2 und höher</entry>
  875. <entry>Alle Logmeldungen in Reihenfolge starten bei Index 2.</entry>
  876. </row>
  877. </tbody>
  878. </tgroup>
  879. </table>
  880. <para>
  881. Aus der Praxis heraus sollte der Index 0 dem Benutzer angezeigt werden
  882. (z.B. bei
  883. Verwendung des FlashMessenger Helfers), Index 1 sollte geloggt werden und, wenn
  884. die
  885. Debugging Information gesammelt wird, sollten die Indezes 2 und höher auch
  886. geloggt
  887. werden (auch wenn die letzte Nachricht immer den String vom Index 1
  888. enthält).
  889. </para>
  890. </sect2>
  891. <sect2 id="zend.auth.adapter.ldap.options-common-server-specific">
  892. <title>Übliche Optionen für spezielle Server</title>
  893. <sect3
  894. id="zend.auth.adapter.ldap.options-common-server-specific.active-directory">
  895. <title>Optionen für Active Directory</title>
  896. <para>
  897. Für
  898. <acronym>ADS</acronym>
  899. sind die folgenden Optionen beachtenswert:
  900. </para>
  901. <table
  902. id="zend.auth.adapter.ldap.options-common-server-specific.active-directory.table">
  903. <title>Optionen für Active Directory</title>
  904. <tgroup cols="2">
  905. <thead>
  906. <row>
  907. <entry>Name</entry>
  908. <entry>Zusätzliche Notizen</entry>
  909. </row>
  910. </thead>
  911. <tbody>
  912. <row>
  913. <entry>
  914. <emphasis>
  915. <property>host</property>
  916. </emphasis>
  917. </entry>
  918. <entry>Wie bei allen Servern, wird diese Option benötigt.</entry>
  919. </row>
  920. <row>
  921. <entry>
  922. <emphasis>
  923. <property>useStartTls</property>
  924. </emphasis>
  925. </entry>
  926. <entry>
  927. Zum Zwecke der Sicherheit, sollte das
  928. <constant>TRUE</constant>
  929. sein
  930. wenn der Server das notwendige Zertifikat installiert hat.
  931. </entry>
  932. </row>
  933. <row>
  934. <entry>
  935. <emphasis>
  936. <property>useSsl</property>
  937. </emphasis>
  938. </entry>
  939. <entry>
  940. Möglicherweise als Alternative zu
  941. <emphasis>useStartTls</emphasis>
  942. zu verwenden (siehe davor).
  943. </entry>
  944. </row>
  945. <row>
  946. <entry>
  947. <emphasis>
  948. <property>baseDn</property>
  949. </emphasis>
  950. </entry>
  951. <entry>
  952. Wie bei allen Servern, wird diese Option benötigt. Standardmäßig
  953. platziert AD alle Benutzer Accounts unter dem
  954. <emphasis>Users</emphasis>
  955. Container (z.B.,
  956. <emphasis>CN=Users,DC=foo,DC=net</emphasis>
  957. ), aber der Standard ist
  958. in größeren Organisationen nicht üblich. Der AD Administrator
  959. sollte
  960. nach der besten DN für Accounts für die eigene Anwendung gefragt
  961. werden.
  962. </entry>
  963. </row>
  964. <row>
  965. <entry>
  966. <emphasis>
  967. <property>accountCanonicalForm</property>
  968. </emphasis>
  969. </entry>
  970. <entry>
  971. Das wird man normalerweise für Schrägstrich-Stil Namen auf 3
  972. stellen
  973. (z.B.,
  974. <filename>FOO\alice</filename>
  975. ), was für Windows Benutzer am
  976. bekanntesten ist. Man sollte
  977. <emphasis>nicht</emphasis>
  978. die
  979. unqualifizierte Form 2 verwenden (z.B.,
  980. <emphasis>alice</emphasis>
  981. ),
  982. da das anderen Benutzern Zugriff auf die Anwendung geben würde,
  983. wenn
  984. Sie den gleichen Benutzernamen in anderen vertrauten Domains haben
  985. (z.B.,
  986. <filename>BAR\alice</filename>
  987. und
  988. <filename>FOO\alice</filename>
  989. würden als der gleiche Benutzer
  990. behandelt). (siehe auch die Notiz anbei.)
  991. </entry>
  992. </row>
  993. <row>
  994. <entry>
  995. <emphasis>
  996. <property>accountDomainName</property>
  997. </emphasis>
  998. </entry>
  999. <entry>
  1000. Das wird mit AD benötigt, ausser
  1001. <property>accountCanonicalForm</property>
  1002. 2 wird
  1003. verwendet, was wiederum nicht eingesetzt werden sollte.
  1004. </entry>
  1005. </row>
  1006. <row>
  1007. <entry>
  1008. <emphasis>
  1009. <property>accountDomainNameShort</property>
  1010. </emphasis>
  1011. </entry>
  1012. <entry>
  1013. Der NetBIOS Name der Domain in der die Benutzer sind und für den
  1014. der
  1015. AD Server die Authorität ist. Das wird benötigt wenn der
  1016. Schrägstrich-Stil
  1017. <property>accountCanonicalForm</property>
  1018. verwendet wird.
  1019. </entry>
  1020. </row>
  1021. </tbody>
  1022. </tgroup>
  1023. </table>
  1024. <note>
  1025. <para>
  1026. Technisch sollte es keine Probleme mit irrtümlichen
  1027. Domain-übergreifenden
  1028. Authentifizierungen mit der aktuellen
  1029. <classname>Zend_Auth_Adapter_Ldap</classname>
  1030. Implementation geben, da
  1031. Serverdomains explizit geprüft werden, aber das muss für zukünftige
  1032. Implementationen, welche die Domain während der Laufzeit ermitteln,
  1033. nicht wahr
  1034. sein, oder auch wenn ein alternativer Adapter verwendet wird (z.B.,
  1035. Kerberos).
  1036. Generell ist bekannt das die Mehrdeutigkeit von Accountnamen ein
  1037. Sicherheitsproblem ist. Man sollte deswegen immer versuchen
  1038. qualifizierte
  1039. Accountnamen zu verwenden.
  1040. </para>
  1041. </note>
  1042. </sect3>
  1043. <sect3
  1044. id="zend.auth.adapter.ldap.options-common-server-specific.openldap">
  1045. <title>Optionen für OpenLDAP</title>
  1046. <para>
  1047. Für OpenLDAP oder einen generellen
  1048. <acronym>LDAP</acronym>
  1049. Server der ein typisches
  1050. posixAccount Stil Schema verwendet sind die folgenden Optionen beachtenswert:
  1051. </para>
  1052. <table
  1053. id="zend.auth.adapter.ldap.options-common-server-specific.openldap.table">
  1054. <title>Optionen für OpenLDAP</title>
  1055. <tgroup cols="2">
  1056. <thead>
  1057. <row>
  1058. <entry>Name</entry>
  1059. <entry>Zusätzliche Notizen</entry>
  1060. </row>
  1061. </thead>
  1062. <tbody>
  1063. <row>
  1064. <entry>
  1065. <emphasis>
  1066. <property>host</property>
  1067. </emphasis>
  1068. </entry>
  1069. <entry>Wie bei allen Servern, wird diese Option benötigt.</entry>
  1070. </row>
  1071. <row>
  1072. <entry>
  1073. <emphasis>
  1074. <property>useStartTls</property>
  1075. </emphasis>
  1076. </entry>
  1077. <entry>
  1078. Zum Zwecke der Sicherheit, sollte das
  1079. <constant>TRUE</constant>
  1080. sein
  1081. wenn der Server das notwendige Zertifikat installiert hat.
  1082. </entry>
  1083. </row>
  1084. <row>
  1085. <entry>
  1086. <emphasis>
  1087. <property>useSsl</property>
  1088. </emphasis>
  1089. </entry>
  1090. <entry>
  1091. Möglicherweise als Alternative zu
  1092. <property>useStartTls</property>
  1093. zu verwenden (siehe davor).
  1094. </entry>
  1095. </row>
  1096. <row>
  1097. <entry>
  1098. <emphasis>
  1099. <property>username</property>
  1100. </emphasis>
  1101. </entry>
  1102. <entry>
  1103. Benötigt und muß ein DN sein, da OpenLDAP den Benutzernamen in DN
  1104. Form benötigt wenn ein Binden durchgeführt wird. Es sollte versucht
  1105. werden einen nicht privilegierten Account zu verwenden.
  1106. </entry>
  1107. </row>
  1108. <row>
  1109. <entry>
  1110. <emphasis>
  1111. <property>password</property>
  1112. </emphasis>
  1113. </entry>
  1114. <entry>
  1115. Das Passwort das zum Benutzernamen von oben gehört. Es kann aber
  1116. unterdrückt werden wenn der
  1117. <acronym>LDAP</acronym>
  1118. Server anonymes
  1119. Binden bei Abfragen zu Benutzer Accounts erlaubt.
  1120. </entry>
  1121. </row>
  1122. <row>
  1123. <entry>
  1124. <emphasis>
  1125. <property>bindRequiresDn</property>
  1126. </emphasis>
  1127. </entry>
  1128. <entry>
  1129. Benötigt und muß
  1130. <constant>TRUE</constant>
  1131. sein, da OpenLDAP den
  1132. Benutzernamen in DN Form benötigt wenn ein Binden durchgeführt wird.
  1133. </entry>
  1134. </row>
  1135. <row>
  1136. <entry>
  1137. <emphasis>
  1138. <property>baseDn</property>
  1139. </emphasis>
  1140. </entry>
  1141. <entry>
  1142. Wie bei allen Servern, wird diese Option benötigt und zeigt den DN
  1143. in dem alle Accounts die authentifiziert werden enthalten sind.
  1144. </entry>
  1145. </row>
  1146. <row>
  1147. <entry>
  1148. <emphasis>
  1149. <property>accountCanonicalForm</property>
  1150. </emphasis>
  1151. </entry>
  1152. <entry>
  1153. Optional, aber der Standardwert ist 4 (prinzipielle-Stil Namen
  1154. wie
  1155. <filename>alice@foo.net</filename>
  1156. ) und könnte für die Benutzer
  1157. nicht ideal sein wenn diese Schrägstrich-Stil Namen verwendetn
  1158. (z.B.,
  1159. <filename>FOO\alice</filename>
  1160. ). Für Schrägstrich-Stil Namen
  1161. sollte der Wert 3 verwendet werden.
  1162. </entry>
  1163. </row>
  1164. <row>
  1165. <entry>
  1166. <emphasis>
  1167. <property>accountDomainName</property>
  1168. </emphasis>
  1169. </entry>
  1170. <entry>
  1171. Benötigt es sei denn man verwendet
  1172. <property>accountCanonicalForm</property>
  1173. 2, was nicht
  1174. zu empfehlen ist.
  1175. </entry>
  1176. </row>
  1177. <row>
  1178. <entry>
  1179. <emphasis>
  1180. <property>accountDomainNameShort</property>
  1181. </emphasis>
  1182. </entry>
  1183. <entry>
  1184. Wenn AD auch nicht verwendet wird, wird dieser Wert nicht
  1185. benötigt.
  1186. Andernfalls, wenn
  1187. <property>accountCanonicalForm</property>
  1188. 3 verwendet
  1189. wird, wird diese Option benötigt und sollte ein Kurzname sein der
  1190. adäquat zu
  1191. <property>accountDomainName</property>
  1192. korrespondiert (z.B., wenn
  1193. <property>accountDomainName</property>
  1194. <filename>foo.net</filename>
  1195. ist, wäre ein guter
  1196. <property>accountDomainNameShort</property>
  1197. Wert
  1198. <acronym>FOO</acronym>
  1199. ).
  1200. </entry>
  1201. </row>
  1202. </tbody>
  1203. </tgroup>
  1204. </table>
  1205. </sect3>
  1206. </sect2>
  1207. </sect1>