Ruby - Tutorial de LDAP
Ruby / LDAP es una biblioteca de extensión para Ruby. Proporciona la interfaz para algunas bibliotecas LDAP como OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.
La API común para el desarrollo de aplicaciones se describe en RFC1823 y es compatible con Ruby / LDAP.
Instalación de Ruby / LDAP
Puede descargar e instalar un paquete completo de Ruby / LDAP desde SOURCEFORGE.NET .
Antes de instalar Ruby / LDAP, asegúrese de tener los siguientes componentes:
- Ruby 1.8.x (al menos 1.8.2 si desea utilizar ldap / control).
- OpenLDAP, Netscape SDK, Windows 2003 o Windows XP.
Ahora, puede utilizar el método de instalación estándar de Ruby. Antes de comenzar, si desea ver las opciones disponibles para extconf.rb, ejecútelo con la opción '--help'.
$ ruby extconf.rb [--with-openldap1|--with-openldap2| \
--with-netscape|--with-wldap32]
$ make
$ make install
NOTE- Si está creando el software en Windows, es posible que deba usar nmake en lugar de make .
Establecer conexión LDAP
Este es un proceso de dos pasos:
Paso 1: crear un objeto de conexión
A continuación se muestra la sintaxis para crear una conexión a un directorio LDAP.
LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
host- Este es el ID de host que ejecuta el directorio LDAP. Lo tomaremos como localhost .
port- Este es el puerto que se utiliza para el servicio LDAP. Los puertos LDAP estándar son 636 y 389. Asegúrese de qué puerto se está usando en su servidor; de lo contrario, puede usar LDAP :: LDAP_PORT.
Esta llamada devuelve una nueva conexión LDAP :: Conn al servidor, host , en el puerto del puerto .
Paso 2 - Encuadernación
Aquí es donde normalmente especificamos el nombre de usuario y la contraseña que usaremos para el resto de la sesión.
A continuación se muestra la sintaxis para vincular una conexión LDAP, utilizando el DN, dn, la credencial, pwdy el método de vinculación, method -
conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)do
....
end
Puede utilizar el mismo método sin un bloque de código. En este caso, necesitaría desvincular la conexión explícitamente de la siguiente manera:
conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)
....
conn.unbind
Si se da un bloque de código, self se cede al bloque.
Ahora podemos realizar operaciones de búsqueda, agregar, modificar o eliminar dentro del bloque del método de vinculación (entre vincular y desvincular), siempre que tengamos los permisos adecuados.
Example
Suponiendo que estamos trabajando en un servidor local, juntemos las cosas con el host, dominio, identificación de usuario y contraseña adecuados, 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
Agregar una entrada LDAP
Agregar una entrada LDPA es un proceso de dos pasos:
Paso 1 - Crear objeto LDAP :: Mod
Necesitamos pasar el objeto LDAP :: Mod al método conn.add para crear una entrada. Aquí hay una sintaxis simple para crear LDAP :: Mod object -
Mod.new(mod_type, attr, vals)
mod_type - Una o más opciones LDAP_MOD_ADD, LDAP_MOD_REPLACE o LDAP_MOD_DELETE.
attr - debe ser el nombre del atributo sobre el que operar.
vals- es una matriz de valores pertenecientes a attr . Si vals contiene datos binarios, mod_type debe tener una lógica OR (|) con LDAP_MOD_BVALUES.
Esta llamada devuelve el objeto LDAP :: Mod , que se puede pasar a métodos en la clase LDAP :: Conn, como Conn # add, Conn # add_ext, Conn # modificar y Conn # modificar_ext.
Paso 2: llamar al método conn.add
Una vez que estemos listos con el objeto LDAP :: Mod , podemos llamar al método conn.add para crear una entrada. Aquí hay una sintaxis para llamar a este método:
conn.add(dn, attrs)
Este método agrega una entrada con el DN, dn y los atributos, attrs . Aquí, los atributos deben ser una matriz de objetos LDAP :: Mod o un hash de pares de matriz de atributo / valor.
Example
Aquí hay un ejemplo completo, que creará dos entradas de directorio:
#/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
Modificar una entrada LDAP
Modificar una entrada es similar a agregar una. Simplemente llame al método de modificación en lugar de agregar con los atributos para modificar. Aquí hay una sintaxis simple del método de modificación .
conn.modify(dn, mods)
Este método modifica una entrada con el DN, dn y los atributos, mods . Aquí, los mods deben ser una matriz de objetos LDAP :: Mod o un hash de pares de matriz de atributo / valor.
Ejemplo
Para modificar el apellido de la entrada, que añadimos en el apartado anterior, escribiríamos -
#/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
Eliminar una entrada LDAP
Para eliminar una entrada, llame al método de eliminación con el nombre distinguido como parámetro. Aquí hay una sintaxis simple del método de eliminación .
conn.delete(dn)
Este método elimina una entrada con el DN, dn .
Ejemplo
Para eliminar la entrada de Zara Mohtashim , que agregamos en la sección anterior, escribiríamos:
#/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
Modificar el nombre distinguido
No es posible modificar el nombre distinguido de una entrada con el método de modificación . En su lugar, utilice el método modrdn . Aquí está la sintaxis simple del método modrdn :
conn.modrdn(dn, new_rdn, delete_old_rdn)
Este método modifica el RDN de la entrada con DN, dn , dándole el nuevo RDN, new_rdn . Si delete_old_rdn es verdadero , el antiguo valor RDN se eliminará de la entrada.
Ejemplo
Supongamos que tenemos la siguiente entrada:
dn: cn = Zara Ali,dc = localhost,dc = localdomain
cn: Zara Ali
sn: Ali
objectclass: person
Luego, podemos modificar su nombre distinguido con el siguiente código:
#/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
Realizar una búsqueda
Para realizar una búsqueda en un directorio LDAP, utilice el método de búsqueda con uno de los tres modos de búsqueda diferentes:
LDAP_SCOPE_BASEM - Busca solo el nodo base.
LDAP_SCOPE_ONELEVEL - Buscar todos los hijos del nodo base.
LDAP_SCOPE_SUBTREE - Busque en todo el subárbol, incluido el nodo base.
Ejemplo
Aquí, vamos a buscar en todo el subárbol de la entrada dc = localhost, dc = localdomain para objetos de 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
Esto invoca el bloque de código dado para cada entrada coincidente donde la entrada LDAP está representada por una instancia de la clase LDAP :: Entry. Con el último parámetro de búsqueda, puede especificar los atributos que le interesan, omitiendo todos los demás. Si pasa nil aquí, todos los atributos se devuelven igual que "SELECT *" en las bases de datos relacionales.
El método dn (alias para get_dn) de la clase LDAP :: Entry devuelve el nombre distinguido de la entrada y, con el método to_hash, puede obtener una representación hash de sus atributos (incluido el nombre distinguido). Para obtener una lista de los atributos de una entrada, use el método attrs (alias de get_attributes). Además, para obtener la lista de los valores de un atributo específico, use el método vals (alias de get_values).
Manejo de errores
Ruby / LDAP define dos clases de excepción diferentes:
En caso de error, los métodos new, bind o unbind generan una excepción LDAP :: Error.
En caso de agregar, modificar, eliminar o buscar en un directorio LDAP, genera un LDAP :: ResultError.
Otras lecturas
Para obtener detalles completos sobre los métodos LDAP, consulte la documentación estándar para la documentación LDAP .