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 .