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 .