sábado, 4 de julho de 2009

Java e LDAP

3

É engraçado ver como os servidores LDAP não vem sendo aproveitados. Na verdade são poucas as linguagens onde a comunidade tem algo para usar com servidores LDAP. No caso do Java existe uma biblioteca o JLDAP, distribuida pela Novell que ajuda o trabalho. É uma biblitoeca bem sfemples e mais facil de utilizar que usar JNDI para comunicar com o servidor LDAP.
Porém muita gente tem dificuldade em criar o servidor e efetuar ações dentro de um servidor LDAP, vou utilizar aqui nesse exemplo o Apache Directory Server como servidor LDAP, então as strings de acesso vão depender muito do servidor que você estará utilizando. Existem ferramentas para explorar os servidores então pode não ser tão dificil assim, basta dar uma espiada no senhor da internet (Google) e acharás o que procuras :).
Começando com o JLDAP:
A base de uma conexão com o servidor LDAP é baseada na classe LDAPConnection, e diferente dos banco de dados, não é a conexão que importa e sim o bind dela. Atraves desse bind o servidor disponibiliza os recursos de acordo com as permissoes do usuário que fez o bind. Exemplo:


LDAPConnection conn = new LDAPConnection();
conn.connect(“localhost”, 37); //Esses dois parametros são servidor (IP ou Nome) e a porta de conexão
conn.bind(LDAPConnection.LDAP_V3, “uid=admin,ou=system”, “secret”.getBytes());

Percebam o bind, ele é composto por versão do servidor LDAP, o DN do usuário a ser logado, lembrem-se o LDAP não funciona como usuário e senha, e talvez precisem ler mais sobre ele e suas siglas, DN, CN, RDN etc. E o ultimo parametro e a senha em um array de byte.
Após esse código existe uma conexão com o servidor LDAP. E podemos manipula-la.
Vamos criar uma nova entidade dentro do servidor LDAP. Vou utilizar a classe Person (Os servidores LDAP também são divididos em classes, são chamadas de objectClass, e essas classes identificam o tipo do registro no servidor), responsavel por cadastrar usuários no servidor LDAP.

LDAPAttributeSet attributes = new LDAPAttributeSet();//Um Set de atributos para o servidor, funciona no formato chave => valor.
attributes.add(new LDAPAttribute("objectClass", "person"));
attributes.add(new LDAPAttribute("cn", "felix"));
attributes.add(new LDAPAttribute("sn", "felix"));
attributes.add(new LDAPAttribute("userpassword", "teste"));
attributes.add(new LDAPAttribute("telephonenumber", "11111111"));
attributes.add(new LDAPAttribute("description", "Eu"));
//Definimos o DN, lembrem-se ele sempre é único e tera uma exception caso não seja único
String dn = "cn=felix,ou=users,ou=system";//Isso pode variar de acordo com o servidor LDAP que você estiver utilizando.
LDAPEntry entry = new LDAPEntry(dn, attributes);
conn.add(entry);//insere a entidade.


bacana Não é? E o mais legal, funciona :). Levei algum tempo para conseguir isso, mas assim é mais simples. Lembrando que deve-se ter um conhecimento básico em LDAP. O dn é formado normalmente pelo cn do usuário e o restante compreende a hierarquia de arvore do LDAP. Vendo como um diretorio seria um arquivo chamado felix dentro da pasta users que esta dentro da pasta system, simple não? E ainda por cima vc pode usar esse DN recem inserido para fazer login no servidor LDAP.
Vamos para a segunda parte. Pesquisar registros.
A pesquisa é baseada na classe LDAPSearchResults, e se basea na busca atraves da arvore de diretorios ou de um DN. A pesquisa aqui vai ser baseada na árvore que acabamos de inserir um registro (ou=users,ou=system), e vamos ver todos os usuários do sistema.

LDAPSearchResults search = conn.search(“ou=users,ou=system”, LDAPConnection.SCOPE_ONE, null, null, false); //não to lembrado do por que desses parametros :P
while(search.hasMore()){//Auto explicativo
LDAPEntry entry = search.next()://Recuperamos a entidade. Cada uma dessas entidades é um usuário do servidor LDAP.
//Vamos carregar e imprimir os atributos desse usuário
LDAPAttributeSet attribute = entry.getAttributeSet();
Iterator it = attribute.iterator();
while(it.hasNext()){
LDAPAttribute att = (LDAPAttribute) it.next();
System.out.println(att.getName() + “ => “ + att.getStringValue());
}
System.out.println();
}

Simples não? E ainda tem gente que acha dificil acessar servidor LDAP via Java :)

Espero que esse post seja util a quem está buscando algo como acessar servidores LDAP.






3 comentários:

Unknown disse...

Ótimo tutorial sobre o JLDAP.
Realmente é bastante útil e fácil de entender!
Valew!

Lucas Bona disse...

Excelente !

Só uma dúvida.
Como faço para retornar apenas o "cn" de um determinado usuário ou grupo ?

Obrigado.

Rafael Felix disse...

sabe que eu não sei ehhehe.

Talvez usando o LADPSearchResults vc consiga encontrar os cn de um grupo.

 
Design by ThemeShift | Bloggerized by Lasantha - Free Blogger Templates | Best Web Hosting