Récemment, je jouais avec l’Active Directory (AD) et j’ai essayé de récupérer des informations sur les utilisateurs via des requêtes LDAP. Ce fut définitivement une expérience frustrante car je n’étais pas très familier avec LDAP. Par conséquent, j’ai décidé d’écrire sur ce que j’ai appris.
Remarque : au moment d’écrire ces lignes, je travaille avec Spring Boot v2.7.7, Gradle v7.6, Docker-Compose v2.14.0, Docker v20.10.3 et Java v11.
Commençons par un peu de contexte. Un Active Directory (AD) est un service d’annuaire couramment utilisé par de nombreuses entreprises pour la gestion des utilisateurs et des groupes, l’administration des politiques, l’authentification, etc. LDAP (Lightweight Directory Access Protocol) est un protocole que nous pouvons utiliser pour communiquer avec les serveurs LDAP ( ex. l’AD).
Lors du développement de services, nous pouvons authentifier les utilisateurs avec LDAP ou récupérer des informations sur les utilisateurs à partir du serveur LDAP. Dans cet article, je me concentrerai principalement sur certaines des méthodes que j’ai utilisées pour interroger le serveur LDAP à l’aide de LdapTemplate. Les LdapTemplate est un ensemble d’API prêtes à l’emploi pour l’exécution d’opérations LDAP de base telles que la création, la modification, la récupération, etc.
Avant de commencer, nous aurons besoin d’un serveur LDAP pour interroger. Dans cette démo, au lieu de configurer un Active Directory complet, nous allons configurer un serveur LDAP à l’aide de osixia/docker-openldap. Il s’agit d’une image docker OpenLDAP qui nous permet de remplir facilement la base de données LDAP à l’aide d’un fichier LDIF.
Pour commencer, nous allons préparer un fichier bootstrap LDIF qui contient toutes les données avec lesquelles nous voulons ensemencer la base de données LDAP. À des fins de démonstration, nous remplirons uniquement la base de données LDAP avec certaines informations utilisateur, comme indiqué ci-dessous.
Exemple de fichier Bootstrap LDIF
Il y a 3 utilisateurs (également appelés entrée) renseignés dans la base de données LDAP avec 3 attributs que nous allons récupérer dans notre démo :
uid : stocke l’identifiant de l’utilisateur
displayname : stocke le nom de l’utilisateur
mail : stocke toutes les adresses e-mail de l’utilisateur
Remarque : Une entrée LDAP est une collection d’informations sur une entité. Chaque entrée se compose de trois composants principaux : un nom distinctif, une collection d’attributs et une collection de classes d’objets.
Pour démarrer le serveur OpenLdap, j’ai créé le fichier YAML docker-compose suivant.
Exemple de Docker Compose pour le serveur OpenLdap
Notez que le domaine est example.org et le répertoire LDAP a l’arborescence suivante après le démarrage avec le LDIF fichier défini ci-dessus.
Arborescence de l’annuaire LDAP
Avec le serveur OpenLdap en cours d’exécution, nous pouvons essayer de créer des requêtes LDAP en utilisant ldapsearch comme indiqué ci-dessous.
# Step into the OpenLdap Docker Container Instance docker exec -it openldap /bin/bash
Les -b L’option indique la base de recherche pour la requête et dans notre cas, nous pouvons utiliser soit dc=example,dc=org ou alors ou=Users,dc=example,dc=org comme référencé dans notre arborescence de répertoire LDAP ci-dessus.
Les -D et -w l’option indique à quel nom distinctif se lier est requis pour l’authentification et par défaut, docker-openldap crée un compte administrateur avec mot de passe admin.
Remarque : Un nom distinctif (DN) est le nom qui identifie et décrit de manière unique une entrée dans un serveur LDAP.
Maintenant que nous savons comment interroger en utilisant ldapsearchessayons de faire la même chose dans Spring Boot avec LdapTemplate.
Spring Boot fournit LDAP de données de printemps qui est une bibliothèque pour la programmation LDAP simple. Il nous permet de configurer facilement un projet Spring Boot pour se connecter et communiquer avec un serveur LDAP. Nous pouvons le faire en important la dépendance spring-boot-starter-data-ldap à notre projet.
Nous sommes intéressés à récupérer les attributs uid, displaynameet mail. Comme vous l’avez peut-être remarqué, il existe plusieurs valeurs pour l’attribut mail. Voyons donc comment nous pouvons récupérer tous ces attributs en utilisant LdapTemplate.
#1 Utiliser AttributesMapper
Lors de la recherche avec LdapTemplateon peut utiliser le AttributesMapper pour mapper les valeurs d’attribut. Selon le documentations,
Intérieurement, LdapTemplate itère sur toutes les entrées trouvées, en appelant le AttributesMapper pour chaque entrée, et rassemble les résultats dans une liste. La liste est ensuite renvoyée par la méthode de recherche.
Voici un exemple sur la façon dont nous pouvons récupérer les attributs de l’utilisateur en utilisant AttributesMapper. Notez que nous recherchons à partir du répertoire ou=Users dans le répertoire de base dc=example,dc=org que nous avons défini ci-dessus. Un filtre uid=$userId est également appliqué pour trouver l’entrée d’utilisateur spécifique.
Cependant, sachez qu’il existe une légère limitation où si vous essayez de récupérer des attributs qui n’existent pas, vous obtiendrez un NullPointerException. De plus, vous ne pourrez pas récupérer le nom distinctif (dn) ou des schémas utilisant le AttributesMapper.
#2 Utiliser ContextMapper
De même, nous pouvons utiliser le AbstractContextMapper pour mapper les attributs d’une entrée. Selon le documentations,
Chaque fois qu’une entrée est trouvée dans l’arborescence LDAP, ses attributs et son nom distinctif (DN) seront utilisés par Spring LDAP pour construire un DirContextAdapter. Cela nous permet d’utiliser un ContextMapper pour transformer les valeurs trouvées.
Voici un exemple sur la façon dont nous pouvons récupérer les attributs de l’utilisateur en utilisant le AbstractContextMapper. L’opération de recherche est la même que AttributesMapper sauf que le mappeur est remplacé par le AbstractContextmapper.
ça gère NullPointerException en retournant null au lieu de lancer des exceptions.
il simplifie les opérations de récupération des attributs (notamment pour les attributs multi-valeurs) avec getStringAttribute() et getStringAttributes() méthodes.
il permet de récupérer des noms distinctifs (dn), des schémas et des classes d’objets.
Si vous connaissez le nom distinctif (dn), vous pouvez utiliser le DefaultIncrementAttributesMapper pour rechercher des attributs à plusieurs valeurs (par exemple, le mail attribut). Voici un exemple de la façon dont vous pouvez l’utiliser.
Production attendue
["amanda@example.org","amanda@test.org"]
Notez que le dn de l’utilisateur est cn=Amanda,ou=Users,dc=example,dc=org. Comme nous avons déjà défini le répertoire de base comme étant dc=example,dc=orgil n’est pas nécessaire d’inclure dc=example,dc=org dans le dn lors de la recherche. Cela entraînera le code d’erreur 32 s’il est inclus.
javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'cn=Amanda,ou=Users,dc=example,dc=org'
C’est ça! Si vous connaissez LDAP et Spring Boot, la plupart de ces informations peuvent être facilement trouvées dans la documentation respective. Cet article est principalement destiné à donner une idée générale de la manière dont vous pouvez effectuer une recherche d’attributs à l’aide de LdapTemplate. J’espère que vous apprécierez cet article autant que j’ai aimé l’écrire 🙂
Pour plus d’informations, consultez ces liens utiles :
Comment interroger Active Directory à l’aide de Spring Boot LdapTemplate | de KBryan | janvier 2023
Requêtes LDAP avec Spring Boot LdapTemplate
Récemment, je jouais avec l’Active Directory (AD) et j’ai essayé de récupérer des informations sur les utilisateurs via des requêtes LDAP. Ce fut définitivement une expérience frustrante car je n’étais pas très familier avec LDAP. Par conséquent, j’ai décidé d’écrire sur ce que j’ai appris.
Remarque : au moment d’écrire ces lignes, je travaille avec Spring Boot v2.7.7, Gradle v7.6, Docker-Compose v2.14.0, Docker v20.10.3 et Java v11.
Commençons par un peu de contexte. Un Active Directory (AD) est un service d’annuaire couramment utilisé par de nombreuses entreprises pour la gestion des utilisateurs et des groupes, l’administration des politiques, l’authentification, etc. LDAP (Lightweight Directory Access Protocol) est un protocole que nous pouvons utiliser pour communiquer avec les serveurs LDAP ( ex. l’AD).
Lors du développement de services, nous pouvons authentifier les utilisateurs avec LDAP ou récupérer des informations sur les utilisateurs à partir du serveur LDAP. Dans cet article, je me concentrerai principalement sur certaines des méthodes que j’ai utilisées pour interroger le serveur LDAP à l’aide de
LdapTemplate
. LesLdapTemplate
est un ensemble d’API prêtes à l’emploi pour l’exécution d’opérations LDAP de base telles que la création, la modification, la récupération, etc.Avant de commencer, nous aurons besoin d’un serveur LDAP pour interroger. Dans cette démo, au lieu de configurer un Active Directory complet, nous allons configurer un serveur LDAP à l’aide de
osixia/docker-openldap
. Il s’agit d’une image docker OpenLDAP qui nous permet de remplir facilement la base de données LDAP à l’aide d’un fichier LDIF.Pour commencer, nous allons préparer un fichier bootstrap LDIF qui contient toutes les données avec lesquelles nous voulons ensemencer la base de données LDAP. À des fins de démonstration, nous remplirons uniquement la base de données LDAP avec certaines informations utilisateur, comme indiqué ci-dessous.
Il y a 3 utilisateurs (également appelés entrée) renseignés dans la base de données LDAP avec 3 attributs que nous allons récupérer dans notre démo :
uid
: stocke l’identifiant de l’utilisateurdisplayname
: stocke le nom de l’utilisateurmail
: stocke toutes les adresses e-mail de l’utilisateurPour démarrer le serveur OpenLdap, j’ai créé le fichier YAML docker-compose suivant.
Notez que le domaine est
example.org
et le répertoire LDAP a l’arborescence suivante après le démarrage avec leLDIF
fichier défini ci-dessus.Avec le serveur OpenLdap en cours d’exécution, nous pouvons essayer de créer des requêtes LDAP en utilisant
ldapsearch
comme indiqué ci-dessous.# Step into the OpenLdap Docker Container Instance
docker exec -it openldap /bin/bash
# Execute LDAP query
ldapsearch -x
-H ldap://localhost:389
-b "dc=example,dc=org"
-D "cn=admin,dc=example,dc=org"
-w admin
Les
-b
L’option indique la base de recherche pour la requête et dans notre cas, nous pouvons utiliser soitdc=example,dc=org
ou alorsou=Users,dc=example,dc=org
comme référencé dans notre arborescence de répertoire LDAP ci-dessus.Les
-D
et-w
l’option indique à quel nom distinctif se lier est requis pour l’authentification et par défaut, docker-openldap crée un compte administrateur avec mot de passeadmin
.Maintenant que nous savons comment interroger en utilisant
ldapsearch
essayons de faire la même chose dans Spring Boot avecLdapTemplate
.Spring Boot fournit LDAP de données de printemps qui est une bibliothèque pour la programmation LDAP simple. Il nous permet de configurer facilement un projet Spring Boot pour se connecter et communiquer avec un serveur LDAP. Nous pouvons le faire en important la dépendance
spring-boot-starter-data-ldap
à notre projet.# Gradle
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-ldap")
}
# Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
Ensuite, pour vous connecter au serveur OpenLdap, nous fournirons les paramètres de connexion suivants dans notre
application.yaml
:spring.ldap:
urls: ldap://localhost:389
base: dc=example,dc=org
username: cn=admin,dc=example,dc=org
password: admin
Avec cela, nous sommes maintenant prêts à utiliser
LdapTemplate
pour interroger le serveur OpenLdap.Tout d’abord, inspectons chaque entrée d’utilisateur. Vous trouverez ci-dessous un exemple d’entrée d’utilisateur.
dn: cn=Amanda,ou=Users,dc=example,dc=org
objectclass: inetOrgPerson
uid: U0
cn: Amanda
givenname: Amanda
displayname: Amanda
mail: amanda@example.org
mail: amanda@test.org
userpassword: amanda
Nous sommes intéressés à récupérer les attributs
uid
,displayname
etmail
. Comme vous l’avez peut-être remarqué, il existe plusieurs valeurs pour l’attributmail
. Voyons donc comment nous pouvons récupérer tous ces attributs en utilisantLdapTemplate
.#1 Utiliser AttributesMapper
Lors de la recherche avec
LdapTemplate
on peut utiliser leAttributesMapper
pour mapper les valeurs d’attribut. Selon le documentations,Voici un exemple sur la façon dont nous pouvons récupérer les attributs de l’utilisateur en utilisant
AttributesMapper.
Notez que nous recherchons à partir du répertoireou=Users
dans le répertoire de basedc=example,dc=org
que nous avons défini ci-dessus. Un filtreuid=$userId
est également appliqué pour trouver l’entrée d’utilisateur spécifique.Production attendue:
[{
"userId":"U0",
"name":"Amanda",
"emails":["amanda@example.org","amanda@test.org"]
}]
Cependant, sachez qu’il existe une légère limitation où si vous essayez de récupérer des attributs qui n’existent pas, vous obtiendrez un
NullPointerException
. De plus, vous ne pourrez pas récupérer le nom distinctif (dn
) ou des schémas utilisant leAttributesMapper
.#2 Utiliser ContextMapper
De même, nous pouvons utiliser le
AbstractContextMapper
pour mapper les attributs d’une entrée. Selon le documentations,Voici un exemple sur la façon dont nous pouvons récupérer les attributs de l’utilisateur en utilisant le
AbstractContextMapper
. L’opération de recherche est la même queAttributesMapper
sauf que le mappeur est remplacé par leAbstractContextmapper
.Production attendue:
[{
"userId":"U0",
"name":"Amanda",
"emails":["amanda@example.org","amanda@test.org"]
}]
L’avantage de la
ContextMapper
est-ceNullPointerException
en retournant null au lieu de lancer des exceptions.getStringAttribute()
etgetStringAttributes()
méthodes.#3 Conseils supplémentaires — DefaultIncrementAttributesMapper
Si vous connaissez le nom distinctif (dn), vous pouvez utiliser le
DefaultIncrementAttributesMapper
pour rechercher des attributs à plusieurs valeurs (par exemple, lemail
attribut). Voici un exemple de la façon dont vous pouvez l’utiliser.Production attendue
["amanda@example.org","amanda@test.org"]
Notez que le dn de l’utilisateur est
cn=Amanda,ou=Users,dc=example,dc=org
. Comme nous avons déjà défini le répertoire de base comme étantdc=example,dc=org
il n’est pas nécessaire d’incluredc=example,dc=org
dans le dn lors de la recherche. Cela entraînera le code d’erreur 32 s’il est inclus.javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'cn=Amanda,ou=Users,dc=example,dc=org'
C’est ça! Si vous connaissez LDAP et Spring Boot, la plupart de ces informations peuvent être facilement trouvées dans la documentation respective. Cet article est principalement destiné à donner une idée générale de la manière dont vous pouvez effectuer une recherche d’attributs à l’aide de
LdapTemplate
. J’espère que vous apprécierez cet article autant que j’ai aimé l’écrire 🙂Pour plus d’informations, consultez ces liens utiles :
Télécharger ici