LDAP : les recherches non indexés et la pagination des résultats

Actuellement je travaille sur une application utilisant un annuaire LDAP comme conteneur de personnes. Dans cette application, les utilisateurs ont la possibilité de faire des recherches pouvant retourner beaucoup de résultats : quels personnes ont un nom commençant par "Du" (sn=Du*).

Par défaut, l'annuaire que nous utilisons (OpenDS 2.2) refuse cette requête :

ldapsearch -b "ou=People,dc=example,dc=com " -h localhost -p 1389 -D "uid=123456,ou=admins,dc=example,dc=com" -w azerty --countEntries "(sn=Du*)"
SEARCH RES conn=11 op=1 msgID=2 result=50 message="Vous ne disposez pas des privilèges suffisants pour lancer une recherche non indexée" nentries=0 etime=0

En effet les utilisateurs non-administrateur n'ont par défaut pas le privilège d'exécution de requête non indexées.

Exécutons la requête en mode administrateur : celle ci me retourne plusieurs milliers d'entrées.

Nous avons un index mais OpenDS limite sa taille à 4000 entrées.

dn: ds-cfg-backend-id=userRoot,cn=Backends,cn=config
ds-cfg-index-entry-limit: 4000

Que faire alors ?

Augmenter l'index peut paraitre une solution simple et évidente : mais quelle limite lui fixer ? 10000 ? Et qu'en sera il quand le volume de données dépassera se seuil ? Quid de l'espace disque consommé par cet index ? Et de son temps de calcul ?

Il semble plus pertinent de donner le privilège d'exécution des requêtes non indexés.

dn: uid=admin,ou=example,dc=com
changetype: modify
add: ds-privilege-name
ds-privilege-name: unindexed-search
SEARCH RES conn=15 op=1 msgID=2 result=4 message="Cette opération de recherche a renvoyé le nombre maximum d'entrées au client (1000)" nentries=1000 etime=532

Aie ! Ca ne marche toujours pas, car OpenDS ne permet pas de retourner plus de 1000 résultats pour une requête.

dn: cn=config ds-cfg-size-limit: 1000

Comment contourner cette limitation ?

Et bien paginons nos résultats !

Demandons à l'annuaire de nous retourner les toutes les entrées en X lots de 1000 résultats.

ldapsearch -b "ou=People,dc=example,dc=com " -h localhost -p 1389 -D "uid=admin,dc=example,dc=com" -w azerty --countEntries --simplePageSize 1000 "(sn=Du*)" dn

Et maintenant ca marche !

Source

LDAP Paged Results - More - Srikanth Konjarla (Sun)

OpenDS.org unindexed search (OpenDS Wiki)

Configuring Indexes on the Local DB Back End (OpenDS Wiki)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet