Ruby - Tutorial LDAP

Ruby / LDAP è una libreria di estensioni per Ruby. Fornisce l'interfaccia ad alcune librerie LDAP come OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.

L'API comune per lo sviluppo di applicazioni è descritta in RFC1823 ed è supportata da Ruby / LDAP.

Installazione di Ruby / LDAP

È possibile scaricare e installare un pacchetto Ruby / LDAP completo da SOURCEFORGE.NET .

Prima di installare Ruby / LDAP, assicurati di avere i seguenti componenti:

  • Ruby 1.8.x (almeno 1.8.2 se vuoi usare ldap / control).
  • OpenLDAP, Netscape SDK, Windows 2003 o Windows XP.

Ora puoi usare il metodo di installazione standard di Ruby. Prima di iniziare, se desideri vedere le opzioni disponibili per extconf.rb, eseguilo con l'opzione '--help'.

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

NOTE- Se stai creando il software su Windows, potresti dover usare nmake invece di make .

Stabilire una connessione LDAP

Questo è un processo in due fasi:

Passaggio 1: creare un oggetto di connessione

Di seguito è riportata la sintassi per creare una connessione a una directory LDAP.

LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
  • host- Questo è l'ID host che esegue la directory LDAP. Lo prenderemo come localhost .

  • port- Questa è la porta utilizzata per il servizio LDAP. Le porte LDAP standard sono 636 e 389. Assicurati di quale porta è in uso sul tuo server altrimenti puoi usare LDAP :: LDAP_PORT.

Questa chiamata restituisce una nuova connessione LDAP :: Conn al server, host , sulla porta della porta .

Passaggio 2: rilegatura

Qui è dove di solito specifichiamo il nome utente e la password che useremo per il resto della sessione.

Di seguito è riportata la sintassi per associare una connessione LDAP, utilizzando il DN, dn, la credenziale, pwde il metodo bind, method -

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

È possibile utilizzare lo stesso metodo senza un blocco di codice. In questo caso, sarà necessario svincolare la connessione in modo esplicito come segue:

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

Se viene fornito un blocco di codice, self viene ceduto al blocco.

Ora possiamo eseguire operazioni di ricerca, aggiunta, modifica o eliminazione all'interno del blocco del metodo bind (tra bind e unbind), a condizione di disporre delle autorizzazioni appropriate.

Example

Supponendo che stiamo lavorando su un server locale, mettiamo insieme le cose con host, dominio, ID utente e password appropriati, ecc.

#/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

Aggiunta di una voce LDAP

L'aggiunta di una voce LDPA è un processo in due fasi:

Passaggio 1: creazione dell'oggetto LDAP :: Mod

Abbiamo bisogno del passaggio dell'oggetto LDAP :: Mod al metodo conn.add per creare una voce. Ecco una semplice sintassi per creare LDAP :: oggetto Mod -

Mod.new(mod_type, attr, vals)
  • mod_type - Una o più opzioni LDAP_MOD_ADD, LDAP_MOD_REPLACE o LDAP_MOD_DELETE.

  • attr - dovrebbe essere il nome dell'attributo su cui operare.

  • vals- è un array di valori relativi ad attr . Se vals contiene dati binari, mod_type dovrebbe essere logicamente OR'ed (|) con LDAP_MOD_BVALUES.

Questa chiamata restituisce un oggetto LDAP :: Mod , che può essere passato ai metodi nella classe LDAP :: Conn, come Conn # add, Conn # add_ext, Conn # modify e Conn # modify_ext.

Passaggio 2: chiamata al metodo conn.add

Una volta che siamo pronti con l' oggetto LDAP :: Mod , possiamo chiamare il metodo conn.add per creare una voce. Ecco una sintassi per chiamare questo metodo:

conn.add(dn, attrs)

Questo metodo aggiunge una voce con DN, dn e attributi attrs . In questo caso, attrs dovrebbe essere un array di oggetti LDAP :: Mod o un hash di coppie di array attributo / valore.

Example

Ecco un esempio completo, che creerà due voci di directory:

#/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

Modifica di una voce LDAP

La modifica di una voce è simile all'aggiunta di una. Basta chiamare il metodo di modifica invece di aggiungere con gli attributi da modificare. Ecco una semplice sintassi del metodo di modifica .

conn.modify(dn, mods)

Questo metodo modifica una voce con DN, dn e attributi, mod . Qui, le mod dovrebbero essere un array di oggetti LDAP :: Mod o un hash di coppie di array attributo / valore.

Esempio

Per modificare il cognome della voce, che abbiamo aggiunto nella sezione precedente, scriveremmo -

#/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

Eliminazione di una voce LDAP

Per eliminare una voce, chiamare il metodo di eliminazione con il nome distinto come parametro. Ecco una semplice sintassi del metodo di eliminazione .

conn.delete(dn)

Questo metodo elimina una voce con DN, dn .

Esempio

Per eliminare la voce di Zara Mohtashim , che abbiamo aggiunto nella sezione precedente, scriveremmo:

#/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

Modifica del nome distinto

Non è possibile modificare il nome distinto di una voce con il metodo di modifica . Usa invece il metodo modrdn . Ecco una semplice sintassi del metodo modrdn :

conn.modrdn(dn, new_rdn, delete_old_rdn)

Questo metodo modifica l'RDN della voce con DN, dn , dandogli il nuovo RDN, new_rdn . Se delete_old_rdn è true , il vecchio valore RDN verrà eliminato dalla voce.

Esempio

Supponiamo di avere la seguente voce:

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

Quindi, possiamo modificare il suo nome distinto con il seguente codice:

#/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

Esecuzione di una ricerca

Per eseguire una ricerca su una directory LDAP, utilizzare il metodo di ricerca con una delle tre diverse modalità di ricerca:

  • LDAP_SCOPE_BASEM - Cerca solo il nodo base.

  • LDAP_SCOPE_ONELEVEL - Cerca tutti i figli del nodo di base.

  • LDAP_SCOPE_SUBTREE - Cerca in tutta la sottostruttura incluso il nodo base.

Esempio

Qui, cercheremo l'intero sottoalbero della voce dc = localhost, dc = localdomain per oggetti persona -

#/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

Ciò richiama il blocco di codice specificato per ciascuna voce corrispondente in cui la voce LDAP è rappresentata da un'istanza della classe LDAP :: Entry. Con l'ultimo parametro di ricerca, puoi specificare gli attributi a cui sei interessato, omettendo tutti gli altri. Se qui si passa nil, tutti gli attributi vengono restituiti come "SELECT *" nei database relazionali.

Il metodo dn (alias per get_dn) della classe LDAP :: Entry restituisce il nome distinto della voce e con il metodo to_hash è possibile ottenere una rappresentazione hash dei suoi attributi (incluso il nome distinto). Per ottenere un elenco degli attributi di una voce, utilizzare il metodo attrs (alias per get_attributes). Inoltre, per ottenere l'elenco dei valori di uno specifico attributo, utilizzare il metodo vals (alias per get_values).

Gestione degli errori

Ruby / LDAP definisce due diverse classi di eccezioni:

  • In caso di errore, i metodi new, bind o unbind sollevano un'eccezione LDAP :: Error.

  • In caso di aggiunta, modifica, eliminazione o ricerca in una directory LDAP solleva un'eccezione LDAP :: ResultError.

Ulteriori letture

Per i dettagli completi sui metodi LDAP, fare riferimento alla documentazione standard per la documentazione LDAP .