Ruby - Tutorial de LDAP

Ruby / LDAP é uma biblioteca de extensão para Ruby. Ele fornece a interface para algumas bibliotecas LDAP como OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.

A API comum para desenvolvimento de aplicativos é descrita em RFC1823 e é suportada por Ruby / LDAP.

Instalação Ruby / LDAP

Você pode baixar e instalar um pacote Ruby / LDAP completo em SOURCEFORGE.NET .

Antes de instalar Ruby / LDAP, certifique-se de ter os seguintes componentes -

  • Ruby 1.8.x (pelo menos 1.8.2 se você quiser usar ldap / control).
  • OpenLDAP, Netscape SDK, Windows 2003 ou Windows XP.

Agora, você pode usar o método de instalação padrão do Ruby. Antes de começar, se quiser ver as opções disponíveis para extconf.rb, execute-o com a opção '--help'.

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

NOTE- Se você estiver construindo o software no Windows, pode ser necessário usar nmake em vez de make .

Estabelecer conexão LDAP

Este é um processo de duas etapas -

Etapa 1 - Criar objeto de conexão

A seguir está a sintaxe para criar uma conexão com um diretório LDAP.

LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
  • host- Este é o ID do host executando o diretório LDAP. Iremos considerá-lo como localhost .

  • port- Esta é a porta que está sendo usada para o serviço LDAP. As portas LDAP padrão são 636 e 389. Certifique-se de qual porta está sendo usada em seu servidor, caso contrário, você pode usar LDAP :: LDAP_PORT.

Esta chamada retorna uma nova conexão LDAP :: Conn ao servidor, host , na porta da porta .

Etapa 2 - Ligação

É aqui que geralmente especificamos o nome de usuário e a senha que usaremos no restante da sessão.

A seguir está a sintaxe para vincular uma conexão LDAP, usando o DN, dn, a credencial, pwd, e o método de ligação, method -

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

Você pode usar o mesmo método sem um bloco de código. Nesse caso, você precisaria desvincular a conexão explicitamente da seguinte maneira -

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

Se um bloco de código é fornecido, self é cedido ao bloco.

Agora podemos realizar operações de pesquisa, adição, modificação ou exclusão dentro do bloco do método de vinculação (entre vincular e desvincular), desde que tenhamos as permissões adequadas.

Example

Supondo que estejamos trabalhando em um servidor local, vamos juntar as coisas com o host, domínio, id de usuário e senha apropriados, 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

Adicionar uma entrada LDAP

Adicionar uma entrada LDPA é um processo de duas etapas -

Etapa 1 - Criação do objeto LDAP :: Mod

Precisamos da passagem do objeto LDAP :: Mod para o método conn.add para criar uma entrada. Aqui está uma sintaxe simples para criar o objeto LDAP :: Mod -

Mod.new(mod_type, attr, vals)
  • mod_type - Uma ou mais opções LDAP_MOD_ADD, LDAP_MOD_REPLACE ou LDAP_MOD_DELETE.

  • attr - deve ser o nome do atributo no qual operar.

  • vals- é uma matriz de valores pertencentes a attr . Se vals contém dados binários, mod_type deve ser logicamente OR'ed (|) com LDAP_MOD_BVALUES.

Esta chamada retorna o objeto LDAP :: Mod , que pode ser passado para métodos na classe LDAP :: Conn, como Conn # add, Conn # add_ext, Conn # modify e Conn # modify_ext.

Etapa 2 - Chamando o método conn.add

Quando estivermos prontos com o objeto LDAP :: Mod , podemos chamar o método conn.add para criar uma entrada. Aqui está uma sintaxe para chamar este método -

conn.add(dn, attrs)

Este método adiciona uma entrada com o DN, dn , e os atributos, attrs . Aqui, attrs deve ser um array de objetos LDAP :: Mod ou um hash de pares de array de atributo / valor.

Example

Aqui está um exemplo completo, que criará duas entradas de diretório -

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

Modificando uma entrada LDAP

Modificar uma entrada é semelhante a adicionar uma. Basta chamar o método de modificação em vez de adicionar os atributos a serem modificados. Aqui está uma sintaxe simples do método de modificação .

conn.modify(dn, mods)

Este método modifica uma entrada com o DN, dn , e os atributos, mods . Aqui, os mods devem ser uma matriz de objetos LDAP :: Mod ou um hash de pares de matriz de atributo / valor.

Exemplo

Para modificar o sobrenome da entrada, que adicionamos na seção anterior, escreverí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

Exclusão de uma entrada LDAP

Para excluir uma entrada, chame o método delete com o nome distinto como parâmetro. Aqui está uma sintaxe simples do método delete .

conn.delete(dn)

Este método exclui uma entrada com o DN, dn .

Exemplo

Para deletar a entrada Zara Mohtashim , que adicionamos na seção anterior, escreverí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

Modificando o Nome Distinto

Não é possível modificar o nome distinto de uma entrada com o método de modificação . Em vez disso, use o método modrdn . Aqui está a sintaxe simples do método modrdn -

conn.modrdn(dn, new_rdn, delete_old_rdn)

Este método modifica o RDN da entrada com DN, dn , dando a ele o novo RDN, new_rdn . Se delete_old_rdn for true , o valor RDN antigo será excluído da entrada.

Exemplo

Suponha que tenhamos a seguinte entrada -

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

Então, podemos modificar seu nome distinto com o seguinte 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

Executando uma Pesquisa

Para realizar uma pesquisa em um diretório LDAP, use o método de pesquisa com um dos três diferentes modos de pesquisa -

  • LDAP_SCOPE_BASEM - Pesquise apenas o nó base.

  • LDAP_SCOPE_ONELEVEL - Pesquisar todos os filhos do nó base.

  • LDAP_SCOPE_SUBTREE - Pesquise toda a subárvore incluindo o nó base.

Exemplo

Aqui, nós estamos indo para pesquisar toda a subárvore de entrada dc = localhost, DC = localdomain para pessoa objetos -

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

Isso invoca o bloco de código fornecido para cada entrada correspondente, onde a entrada LDAP é representada por uma instância da classe LDAP :: Entry. Com o último parâmetro de pesquisa, você pode especificar os atributos nos quais está interessado, omitindo todos os outros. Se você passar nil aqui, todos os atributos serão retornados da mesma forma que "SELECT *" nos bancos de dados relacionais.

O método dn (alias para get_dn) da classe LDAP :: Entry retorna o nome distinto da entrada e, com o método to_hash, você pode obter uma representação hash de seus atributos (incluindo o nome distinto). Para obter uma lista dos atributos de uma entrada, use o método attrs (alias para get_attributes). Além disso, para obter a lista de valores de um atributo específico, use o método vals (apelido para get_values).

Tratamento de erros

Ruby / LDAP define duas classes de exceção diferentes -

  • Em caso de erro, os métodos new, bind ou unbind geram uma exceção LDAP :: Error.

  • No caso de adicionar, modificar, excluir ou pesquisar um diretório LDAP, acione um LDAP :: ResultError.

Leitura Adicional

Para obter detalhes completos sobre os métodos LDAP, consulte a documentação padrão da Documentação LDAP .