LDAP
LDAP (Lightweight Directory Access Protocol) est un protocole réseau relatif à des annuaires informatiques. La RFC1823 propose en outre une API (interface de programmation) normalisée d'accès aux annuaires LDAP.
Voici quelques références utiles pour qui veut mettre en oeuvre un tel annuaire.
- L'article de Wikipedia
- Un tutoriel
- un panorama des outils LDAP
- la RCF1823 qui définit l'API C.
- Le module Apache d'authentification par LDAP. Ce module permet de vérifier login/mot de passe à partir d'un répertoire LDAP.
- Open LDAP : une mise en oeuvre open-source du protocole. Outre le serveur, ce projet propose des API de connexion en C et Java qui respectent la RFC1823.
- SASL : une couche de communication qui gère l'authentification avec négociation du protocole utilisé. Cette couche est utilisée par open_ldap
Voici quelques références utiles pour qui veut mettre en oeuvre un tel annuaire.
- L'article de Wikipedia
- Un tutoriel
- un panorama des outils LDAP
- la RCF1823 qui définit l'API C.
- Le module Apache d'authentification par LDAP. Ce module permet de vérifier login/mot de passe à partir d'un répertoire LDAP.
- Open LDAP : une mise en oeuvre open-source du protocole. Outre le serveur, ce projet propose des API de connexion en C et Java qui respectent la RFC1823.
- SASL : une couche de communication qui gère l'authentification avec négociation du protocole utilisé. Cette couche est utilisée par open_ldap
En java, les classes LDAP standard incluent une mise en oeuvre de SASL. Dans ce cas, SASL n'est pas indépendante de ces classes, c'est à dire qu'il ne peut pas être utilisé dans une autre contexte.
Quelques pièges de l'API open-ldap C :
- les valeurs retournées sont en UTF-8 . Dans le cas où l'on veut utiliser un autre jeu de caractères, il faut convertir. L'API open_ldap, contrairement à d'autres API qui respectent la RFC 1823 ne fournit pas de paramétrage pour effectuer automatiquement cette transformation. Il faut utiliser un convertisseur externe comme iconv qui est standard en C.
- Il faut bien lire la RFC pour savoir ce que l'on doit libérer après usage, sinon on risque de provoquer des fuites mémoire et autres problèmes. D'après certaines discussions, il semble que certaines fonctions, bien que retournant une erreur allouent quand même des données. Il faut donc être très rigoureux dans la gestion des ressources.
- La voix de la simplicité est d'encapsuler l'API dans des classes C++ et de laisser les destructeurs libérer les ressources. En utilisant la technique de "l'acquisition de ressources par initialisation", il est alors possible de ne plus du tout avoir de nettoyage manuel à faire en cas d'une exception dans le programme (y compris si l'exception vient de tout autre chose que l'annuaire).
- Pour retrouver le dn (distinguish name) d'une entrée, il ne faut pas utiliser la fonction
- Supposons que l'on demande un attribut dans le tableau attrs passé en argument de
- Le code d'erreur n'est pas automatiquement remis à zéro à chaque opération. Parfois, on n'est pas sûr qu'il y a erreur (par exemple lorsqu'on parcourt les résultats d'une recherche
Quelques pièges de l'API open-ldap C :
- les valeurs retournées sont en UTF-8 . Dans le cas où l'on veut utiliser un autre jeu de caractères, il faut convertir. L'API open_ldap, contrairement à d'autres API qui respectent la RFC 1823 ne fournit pas de paramétrage pour effectuer automatiquement cette transformation. Il faut utiliser un convertisseur externe comme iconv qui est standard en C.
- Il faut bien lire la RFC pour savoir ce que l'on doit libérer après usage, sinon on risque de provoquer des fuites mémoire et autres problèmes. D'après certaines discussions, il semble que certaines fonctions, bien que retournant une erreur allouent quand même des données. Il faut donc être très rigoureux dans la gestion des ressources.
- La voix de la simplicité est d'encapsuler l'API dans des classes C++ et de laisser les destructeurs libérer les ressources. En utilisant la technique de "l'acquisition de ressources par initialisation", il est alors possible de ne plus du tout avoir de nettoyage manuel à faire en cas d'une exception dans le programme (y compris si l'exception vient de tout autre chose que l'annuaire).
- Pour retrouver le dn (distinguish name) d'une entrée, il ne faut pas utiliser la fonction
ldap_get_values()
. La fonction dédiée est ldap_get_dn()
.- Supposons que l'on demande un attribut dans le tableau attrs passé en argument de
ldap_search( LDAP *ld, char *base, int scope, char *filter, char *attrs[], int attrsonly );
. On est pas du tout assuré que l'attribut va se trouver effectivement dans chaque entrée retournée. Si ce n'est pas le cas, ldap_get_values_len()
retourne une erreur étrange ("Erreur LDAP -4 : Decoding error"). Pour éviter cela, il faut vérifier au préalable l'existence de l'attribut en parcours la liste des attributs retournés pour une entrée donnée. Cette opération est faite à l'aide des fonctions : ldap_first_attribute()
et ldap_next_attribute()
.- Le code d'erreur n'est pas automatiquement remis à zéro à chaque opération. Parfois, on n'est pas sûr qu'il y a erreur (par exemple lorsqu'on parcourt les résultats d'une recherche
ldap_next_entry()
retourne 0 si on a atteint la fin des entrées ou s'il y a erreur). Dans ce cas, pour savoir s'il y a erreur, il faut regarder le code d'erreur. Il ne faut pas oublier avant l'appel de la fonction, de bien le remettre à zéro le code d'erreur par : int err = 0; ldap_set_option(ldap, LDAP_OPT_ERROR_NUMBER, &err);
Commentaires
Afficher les commentaires en Vue non groupée | Vue groupée
Sébastien sur :
- Il existe sous Unix (OpenLdap) un commande ldapsearch :
exemple : ldapsearch -h ldap.dubourg.name -b "dc=dubourg,dc=fr" "(&(uid=sdubourg) (IsActive=Yes))" mail