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 .