Ruby - Tutoriel LDAP

Ruby / LDAP est une bibliothèque d'extension pour Ruby. Il fournit l'interface à certaines bibliothèques LDAP comme OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.

L'API commune pour le développement d'applications est décrite dans RFC1823 et est prise en charge par Ruby / LDAP.

Installation de Ruby / LDAP

Vous pouvez télécharger et installer un package Ruby / LDAP complet à partir de SOURCEFORGE.NET .

Avant d'installer Ruby / LDAP, assurez-vous que vous disposez des composants suivants -

  • Ruby 1.8.x (au moins 1.8.2 si vous souhaitez utiliser ldap / control).
  • OpenLDAP, Netscape SDK, Windows 2003 ou Windows XP.

Maintenant, vous pouvez utiliser la méthode d'installation Ruby standard. Avant de commencer, si vous souhaitez voir les options disponibles pour extconf.rb, exécutez-le avec l'option '--help'.

$ ruby extconf.rb [--with-openldap1|--with-openldap2| \
                   --with-netscape|--with-wldap32]
$ make
$ make install

NOTE- Si vous créez le logiciel sous Windows, vous devrez peut-être utiliser nmake au lieu de make .

Établir une connexion LDAP

Il s'agit d'un processus en deux étapes -

Étape 1 - Créer un objet de connexion

Voici la syntaxe pour créer une connexion à un annuaire LDAP.

LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
  • host- Il s'agit de l'ID d'hôte exécutant l'annuaire LDAP. Nous le prendrons comme localhost .

  • port- Il s'agit du port utilisé pour le service LDAP. Les ports LDAP standard sont 636 et 389. Vérifiez quel port est utilisé sur votre serveur, sinon vous pouvez utiliser LDAP :: LDAP_PORT.

Cet appel renvoie une nouvelle connexion LDAP :: Conn au serveur, hôte , sur le port du port .

Étape 2 - Reliure

C'est là que nous spécifions généralement le nom d'utilisateur et le mot de passe que nous utiliserons pour le reste de la session.

Voici la syntaxe pour lier une connexion LDAP, en utilisant le DN, dn, le justificatif, pwd, et la méthode bind, method -

conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)do
....
end

Vous pouvez utiliser la même méthode sans bloc de code. Dans ce cas, vous devrez supprimer la connexion explicitement comme suit -

conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)
....
conn.unbind

Si un bloc de code est donné, self est cédé au bloc.

Nous pouvons maintenant effectuer des opérations de recherche, d'ajout, de modification ou de suppression à l'intérieur du bloc de la méthode bind (entre bind et unind), à condition que nous ayons les autorisations appropriées.

Example

En supposant que nous travaillons sur un serveur local, mettons les choses ensemble avec l'hôte, le domaine, l'ID utilisateur et le mot de passe appropriés, etc.

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
....
conn.unbind

Ajout d'une entrée LDAP

L'ajout d'une entrée LDPA est un processus en deux étapes -

Étape 1 - Création de l' objet LDAP :: Mod

Nous avons besoin du passage d'objet LDAP :: Mod à la méthode conn.add pour créer une entrée. Voici une syntaxe simple pour créer un objet LDAP :: Mod -

Mod.new(mod_type, attr, vals)
  • mod_type - Une ou plusieurs options LDAP_MOD_ADD, LDAP_MOD_REPLACE ou LDAP_MOD_DELETE.

  • attr - devrait être le nom de l'attribut sur lequel opérer.

  • vals- est un tableau de valeurs appartenant à attr . Si vals contient des données binaires, mod_type doit être logiquement OU (|) avec LDAP_MOD_BVALUES.

Cet appel renvoie l' objet LDAP :: Mod , qui peut être passé aux méthodes de la classe LDAP :: Conn, telles que Conn # add, Conn # add_ext, Conn # modify et Conn # modify_ext.

Étape 2 - Appel de la méthode conn.add

Une fois que nous sommes prêts avec l' objet LDAP :: Mod , nous pouvons appeler la méthode conn.add pour créer une entrée. Voici une syntaxe pour appeler cette méthode -

conn.add(dn, attrs)

Cette méthode ajoute une entrée avec le DN, dn et les attributs, attrs . Ici, attrs doit être soit un tableau d' objets LDAP :: Mod , soit un hachage de paires de tableaux attribut / valeur.

Example

Voici un exemple complet, qui créera deux entrées de répertoire -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
entry1 = [
   LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','domain']),
   LDAP.mod(LDAP::LDAP_MOD_ADD,'o',['TTSKY.NET']),
   LDAP.mod(LDAP::LDAP_MOD_ADD,'dc',['localhost']),
]

entry2 = [
   LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','person']),
   LDAP.mod(LDAP::LDAP_MOD_ADD, 'cn', ['Zara Ali']),
   LDAP.mod(LDAP::LDAP_MOD_ADD | LDAP::LDAP_MOD_BVALUES, 'sn', 
                     ['ttate','ALI', "zero\000zero"]),
]

begin
   conn.add("dc = localhost, dc = localdomain", entry1)
   conn.add("cn = Zara Ali, dc = localhost, dc =  localdomain", entry2)
rescue LDAP::ResultError
   conn.perror("add")
   exit
end
conn.perror("add")
conn.unbind

Modifier une entrée LDAP

La modification d'une entrée revient à en ajouter une. Appelez simplement la méthode modify au lieu d' ajouter add avec les attributs à modifier. Voici une syntaxe simple de la méthode modify .

conn.modify(dn, mods)

Cette méthode modifie une entrée avec le DN, dn et les attributs, mods . Ici, les mods doivent être soit un tableau d' objets LDAP :: Mod , soit un hachage de paires de tableaux attribut / valeur.

Exemple

Pour modifier le nom de famille de l'entrée, que nous avons ajouté dans la section précédente, nous écririons -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
entry1 = [
   LDAP.mod(LDAP::LDAP_MOD_REPLACE, 'sn', ['Mohtashim']),
]

begin
   conn.modify("cn = Zara Ali, dc = localhost, dc = localdomain", entry1)
rescue LDAP::ResultError
   conn.perror("modify")
   exit
end
conn.perror("modify")
conn.unbind

Suppression d'une entrée LDAP

Pour supprimer une entrée, appelez la méthode de suppression avec le nom distinctif comme paramètre. Voici une syntaxe simple de la méthode de suppression .

conn.delete(dn)

Cette méthode supprime une entrée avec le DN, dn .

Exemple

Pour supprimer l' entrée Zara Mohtashim , que nous avons ajoutée dans la section précédente, nous écririons -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.delete("cn = Zara-Mohtashim, dc = localhost, dc = localdomain")
rescue LDAP::ResultError
   conn.perror("delete")
   exit
end
conn.perror("delete")
conn.unbind

Modifier le nom distinctif

Il n'est pas possible de modifier le nom distinctif d'une entrée avec la méthode modify . Utilisez plutôt la méthode modrdn . Voici la syntaxe simple de la méthode modrdn -

conn.modrdn(dn, new_rdn, delete_old_rdn)

Cette méthode modifie le RDN de l'entrée avec DN, dn , en lui donnant le nouveau RDN, new_rdn . Si delete_old_rdn est vrai , l'ancienne valeur RDN sera supprimée de l'entrée.

Exemple

Supposons que nous ayons l'entrée suivante -

dn: cn = Zara Ali,dc = localhost,dc = localdomain
cn: Zara Ali
sn: Ali
objectclass: person

Ensuite, nous pouvons modifier son nom distinctif avec le code suivant -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.modrdn("cn = Zara Ali, dc = localhost, dc = localdomain", "cn = Zara Mohtashim", true)
rescue LDAP::ResultError
   conn.perror("modrdn")
   exit
end
conn.perror("modrdn")
conn.unbind

Effectuer une recherche

Pour effectuer une recherche dans un annuaire LDAP, utilisez la méthode de recherche avec l'un des trois modes de recherche différents -

  • LDAP_SCOPE_BASEM - Recherchez uniquement le nœud de base.

  • LDAP_SCOPE_ONELEVEL - Recherchez tous les enfants du nœud de base.

  • LDAP_SCOPE_SUBTREE - Recherchez tout le sous-arbre, y compris le nœud de base.

Exemple

Ici, nous allons rechercher tout le sous-arbre de l'entrée dc = localhost, dc = localdomain pour les objets personne -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

base = 'dc = localhost,dc = localdomain'
scope = LDAP::LDAP_SCOPE_SUBTREE
filter = '(objectclass = person)'
attrs = ['sn', 'cn']

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.search(base, scope, filter, attrs) { |entry|
      # print distinguished name
      p entry.dn
      # print all attribute names
      p entry.attrs
      # print values of attribute 'sn'
      p entry.vals('sn')
      # print entry as Hash
      p entry.to_hash
   }
rescue LDAP::ResultError
   conn.perror("search")
   exit
end
conn.perror("search")
conn.unbind

Cela appelle le bloc de code donné pour chaque entrée correspondante où l'entrée LDAP est représentée par une instance de la classe LDAP :: Entry. Avec le dernier paramètre de recherche, vous pouvez spécifier les attributs qui vous intéressent, en omettant tous les autres. Si vous passez nil ici, tous les attributs sont retournés comme "SELECT *" dans les bases de données relationnelles.

La méthode dn (alias pour get_dn) de la classe LDAP :: Entry renvoie le nom distinctif de l'entrée, et avec la méthode to_hash, vous pouvez obtenir une représentation hachée de ses attributs (y compris le nom distinctif). Pour obtenir une liste des attributs d'une entrée, utilisez la méthode attrs (alias pour get_attributes). De plus, pour obtenir la liste des valeurs d'un attribut spécifique, utilisez la méthode vals (alias pour get_values).

Traitement des erreurs

Ruby / LDAP définit deux classes d'exceptions différentes -

  • En cas d'erreur, les méthodes new, bind ou unbind lèvent une exception LDAP :: Error.

  • En cas d'ajout, de modification, de suppression ou de recherche dans un annuaire LDAP, une erreur LDAP :: ResultError est générée.

Lectures complémentaires

Pour plus de détails sur les méthodes LDAP, veuillez consulter la documentation standard de la documentation LDAP .