Projets
Pages enfant
  • 3.5.1 Accès à l'annuaire LDAP en lecture

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Commentaire: Migration of unmigrated content due to installation of a new plugin
A revoir
Remarquetip
titleA compléter
Bon pour relecture

Sommaire :

Sommaire
maxLevel35

...

Cette page montre comment on peut accéder en lecture aux information contenues dans un annuaire LDAP. Pour un accès en écriture se référer à Accès à l'annuaire LDAP en écriture.

...

La déclaration d'un bean ldapUserService de cette classe ressemblera à :

Bloc de code
	<bean
  id="ldapUserService"
  		class="[org...]esupportail.commons.services.ldap.SearchableLdapUserServiceImpl"
  >
  		lazy-init="true"
		>
		<property name="ldapTemplatei18nService" ref="ldapTemplatei18nService" />
  		<property name="uidAttributeldapTemplate" valueref="uidldapTemplate" />
  		<property name="searchAttributednSubPath" value="cn" ${ldap.dnSubPath}"/>
  		<property name="idAttribute" value="searchDisplayedAttributes"${ldap.uidAttribute}"/>
		<property    <list>
      <value>displayName</value>
      <value>ur1composante</value>
      <value>ur1typeEntree</value>
    </list>
  </property>
  <property name="otherAttributes">
    <list>
      <value>homeDirectory</value>
    </list>
  </property>
  name="attributesAsString" value="${ldap.attributes}"/>
		<property name="searchAttribute" value="${ldap.searchAttribute}"/>
		<property name="searchDisplayedAttributesAsString" value="${ldap.searchDisplayedAttributes}" />
		<property name="cacheManager" ref="cacheManager"/>
		<property name="cacheName" value=""/>
		<property name="testFilter" value="cn=*bourges*${ldap.testFilter}" />
	</bean>

La propriété uidAttribute donne le nom de l'attribut LDAP qui contient l'identifiant unique des utilisateurs de l'annuaire.

La propriété searchAttributes donne le nom de l'attribut sur lequel on effectue des recherches. Dans l'exemple ci-dessous, la recherche du mot bourges utilisera le filtre cn=bourges*.

...

... avec dans config.properties :

Bloc de code

########################################################################
# LDAP
#
ldap.url=ldap://ldap.univ.fr:389,ldap://ldap2.univ.fr:389
ldap.userDn=uid=user,ou=comptes,dc=univ,dc=fr
ldap.password=mdp
ldap.base=dc=univ,dc=fr
ldap.dnSubPath=ou=people
ldap.uidAttribute=uid
ldap.displayNameAttribute=displayName
ldap.emailAttribute=mail
ldap.searchAttribute=cn
ldap.testFilter=cn=*bourges*
ldap.attributes=cn,displayName,employeeType,department,homeDirectory
ldap.searchDisplayedAttributes=cn,displayName,employeeType,department

La propriété uidAttribute donne le nom de l'attribut LDAP qui contient l'identifiant unique des utilisateurs de l'annuaire.

La propriété searchAttributes donne le nom de l'attribut sur lequel on effectue des recherches. Dans l'exemple ci-dessous, la recherche du mot bourges utilisera le filtre cn=bourges*.

La propriété searchDisplayedAttributes donne les noms des attributs qui seront affichés à l'utilisateur lors du choix d'un utilisateur parmi plusieurs (après une recherche dans l'annuaire). Par exemple : Image Added
La propriété otherAttributes donne les noms des attributs qui seront remontés lors des requêtes LDAP, pour être utilisés dans du code Java.




La propriété testFilter pourra être utilisée dans les classes de test JUnit.

Cette classe s'appuie sur la bibliothèque LdapTemplate  org.springframework.ldap.core.LdapTemplate:

Bloc de code

	<bean 
		id="ldapTemplate" 
		class="org.springframework.ldap.core.LdapTemplate"
		lazy-init="true"
		>		
		<property name="contextSource" ref="contextSource"/>
	</bean>

	<bean id="contextSource"
		class="org.esupportail.commons.services.ldap.MultiUrlLdapContextSource"
		lazy-init="true"
		>
		<property name="url" value="${ldap.url}"/>
		<property name="userDn" value="${ldap.userDn}"/>
		<property name="password" value="${ldap.password}"/>
		<property name="base" value="${ldap.base}"/>
		<property name="baseEnvironmentProperties">
			<map>
				<entry key="com.sun.jndi.ldap.connect.timeout"
					value="${ldap.connectTimeout}" />
			</map>
		</property>
	</bean>

Mise en cache des requêtes LDAP

Il est possible d'injecter un gestionnaire de cache aux instances de cette classe pour leur faire cacher le résultat des requêtes afin de moins solliciter l'annuaire LDAP (pour plus de performances).

Il suffit de rajouter à la déclaration précédente :

Bloc de code

<bean
  id="ldapUserService"
  class="[...].commons.services.ldap.SearchableLdapUserServiceImpl"
  >
  ...

La propriété testFilter est utilisée par la tâche ant test-ldap.

...

Bloc de code

<bean id="ldapTemplate" class="net.sf.ldaptemplate.LdapTemplate">
  <property name="contextSource" ref="contextSource" />
</bean>

<bean
    id="contextSource"
    class="net.sf.ldaptemplate.support.LdapContextSource">
  <property name="url" value="ldap://ldap.esup-portail.org:389" />
  <property name="userName" value="" />
  <property name="password" value="" />
  <property name="base" value="ou=people,dc=esup-portail,dc=org"/>
  <property name="baseEnvironmentPropertiescacheManager">
    <map>ref="cacheManager" />
      <entry key="com.sun.jndi.ldap.connect.timeout<property name="cacheName" value="5000" />
    </map>
  </property>
</bean>

Mise en cache des requêtes LDAP

Il est possible d'injecter un gestionnaire de cache aux instances de cette classe pour leur faire cacher le résultat des requêtes afin de moins solliciter l'annuaire LDAP (pour plus de performances).

Il suffit de rajouter à la déclaration précédente :


</bean>

Le bean cacheManager est en général défini dans le fichier de configuration /properties/cache/cache.xml et notamment /properties/cache/ehcache.xml Le nom du cache est optionnel.

Bloc de code

 <cache 
    	name="org.esupportail
Bloc de code

<bean
  id="ldapUserService"
  class="[...].commons.services.ldap.SearchableLdapUserServiceImplCachingLdapServiceImpl"
    	maxElementsInMemory="1000" >
    ...	eternal="false" 
  <property  name	timeToIdleSeconds="cacheManager300" ref
    	timeToLiveSeconds="cacheManager600" />
   <property name	overflowToDisk="cacheNametrue" value="" />
</bean>

Le bean cacheManager est en général défini dans le fichier de configuration /properties/cache/cache.xml. Le nom du cache est optionnel.

 
    	/>

Accès aux statistiques LDAP

...

  • LdapConnectionException, lorsque l'annuaire LDAP est inaccessible,
  • LdapBadFilterException, lorsqu'un mauvais filtre est utilisé,
  • LdapMiscException, pour toute autre erreur. Image Removed

Image Added

Il appartient au programmeur d'attraper ou non ces exceptions en fonction du contexte de l'application.

Recherche d'un utilisateur par son identifiant

...

L'utilisateur doit alors pouvoir sélectionner un des utilisateurs (en cliquant dessus) et revenir sur la page administratorAdd.jsp, en remplissant sa boite de dialogue.Toute cette cinématique est disponible de base dans esup-commons, nous allons détailler cet exemple pour bien comprendre son fonctionnement.

Page appelante

Le contrôleur administratorsControler, chargé de toutes les interactions avec l'utilisateur pour la partie « administration » de l'application, implémente l'interface LdapCaller. Il possède donc une méthode setLdapUid() qui pourra être appelée par le contrôleur de la recherche LDAP en cas de succès. Cela remplira d'ailleurs automatiquement la boîte de dialogue de administratorAdd.jsp puisque celle-ci est liée à la propriété ldapUid du contrôleur administratorsControler :

...