Realizando pesquisas com o SpringLDAP no ApacheDS

O ApacheDS é uma solução que prove soluções de diretório totalmente escrita em Java.

Neste post vamos aprender a instalar e configurar o ApacheDS, o utilizaremos como serviço de diretórios LDAP e após vamos realizar querys no diretório com o Spring LDAP tudo isso no Windows. O ApacheDS é certificado pelo Open Group como um serviço de diretório LDAP v3.

As grandes vantagens de se utilizar o ApacheDS é que com ele conseguimos utilizar triggers, views, stored procedures e queues no mundo do LDAP. Além da possibilidade de colocar o ApacheDS embarcado em outras aplicações como fazemos com o banco Derby por exemplo.

Para fcilitar a nossa vida como administradores LDAP podemos utilizar o Studio, que é outra solução muito interessante para administrarmos o ApacheDS, o Studio é uma aplicação escrita com o Eclipse RCP, muito fácil de administrar e pode ser utilizada com qualquer servidor LDAP.

LDAP V3

O LDAP é um protocolo para serviços de diretórios. Com ele podemos realizar pesquisas e atualizações sobre um diretório de forma padronizada. Basicamente o LDAP é composto por uma arvore hierárquica onde em cada nó representa algum tipo de informação. O Padrão é utilizar a mesma estrutura de nomes do DNS, mais isso pode ser customizada e podemos armazenar qualquer informação que nos seja pertinente.



Você pode conferir a versão 3.0 da especificação aqui.

Requerimentos:
Instalações

Você deve realizar o donwload do ApacheDS e executar o instalador, basta ir clicando em NEXT até o fim da instalação. A instalação do Apache Studio é muito fácil também, basta ir clicando em NEXT. Muito bem agora que instalamos vamos configurar o diretório e criar algumas entradas.

Configurando o ApacheDS

Primeiramente vamos abrir o studio, ele fica nos programas do menu iniciar. Clique na aba Servers e depois em New Server. Escreva localhost pronto, você adicionou um servidor LDAP.

Clique em cima do Servidor que você criou com o botão direito do mouse e clique em Open Configuration e marque a opção Allow Anonymous Acess. E também marque a opção Enable Acess Control.



Clique em cima do servidor que você acabou de adicionar na aba Servers e depois em Run. Você pode ser advertido que o servidor irá rodar em duas portas uma para o LDAP(10389) e outra para o LDAPS(10386) , confirme. Também é possível que o windows tente bloquear a sua requisição, caso isso aconteça ele irá mostra uma janela e você deve clicar em Desbloquear.

Criando uma conexão

Clique em cima do Servidor LDAP com o botão direito do mouse clique em LDAP Browser e depois em Create a New Connection. Pronto possuirmos uma conexão ao repositório.

Abra a conexão na aba Connections clicando com o botão direito do mouse sobre a conexão e clicando depois no item Open Connection.

A conexão deve ser estabelecida sem problemas, você pode testar a conexão navegando da arvore de diretórios da aba LDAP Browser.

Criando entradas Personalizadas

Na Aba LDAP Browser clique em cima da entrada ou=system, depois vá na entrada ou=users, clique com o botão direito do mouse e clique em New Entry.



Agora selecione a opção create entry from scratch e avance. Digite organization e selecione essa classe, então clique em add. Avançando você deverá prover as informações da organização.



No momento estamos informando os dados de uma empresa, pense que pode ser a empresa que você trabalha ou até mesmo, algum fornecedor ou terceiro que deve ter acesso a alguma sistema de sua empresa.

Você pode informar diversos dados da empresa como por exemplo: Código postal, endereço, telefone, fax, e-mail, etc... Todas essas informações são definidos em um schema, esse pode ser consultado aqui.

Agora adicionaremos o nome da empresa que é representado pelo atributo o e colocaremos como valor MinhaEmpresa.





Agora você pode avançar e finalizar. Vamos adicionar agora os setores da empresa, que são chamados de unidades da organização, para isso adicione uma nova entrada.

É importante que você esteja com a entrada o=MinhaEmpresa selecionada, caso do contrário a criação não sera feita sobre a empresa. Em outras palavras você pode acabar adicionando o setor onde você não quer!

Então adicione a classe organizationalUnit e para a propriedade ou informe TI. Tendo como resultado final o seguinte:



Pronto. Vamos adicionar um usuário, um usuário tem diversas classes, você pode adicionar diversas classes a uma entrada, para facilitar a criação de um usuário vamos copiar a entrada do usuário administrador do ApacheDS e copiar para os nossos usuário.

Para realizar essa etapa clique em cima da entrada uid=admin e clique em Copy Entry / DN.



Agora vamos colar a entrada do usuário administrador no nosso diretório e modificar os dados. Clique novamente sobre ou=TI e com o botão direito do mouse clique em Paste Entry.
Modifique as seguintes chaves com os seguintes valores:
  • cn=Administrador do Sistema
  • sn=administrador
No userPassword você deverá informar a senha do seu usuário, coloque sem as aspas "teste".
Ok. Já possuimos uma pequena arvore no LDAP. Agora vamos ao SpringDAP, com ele poderemos consultar as informações da nossa arvore.

Spring LDAP

Spring LDAP é um framework que prove diversas abstrações em termos de pesquisa para o LDAP e ao mesmo tempo adicionando as facilidades e integração com o contexto do Spring. Você faz um query no LDAP com uma espécie de JDBCTemplate porem para LDAP.

Código

Vamos começar pelo pojo Pessoa, esse pojo representa uma pessoa em sua aplicação. Confira o código a baixo, é um pojo normal.

package com.blogspot.diegopacheco.ldap.pojo;

/**
* Pojo Pessoa.
*
* @author Diego Pacheco
* @since 07/12/2008
*/
public class Pessoa {

private String nome;
private String cargo;

public Pessoa() {}

public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}

public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}

@Override
public String toString() {
return "nome: " + nome + ", cargo: " + cargo;
}   

}


Agora vamos ao service que faz a busca no ldap com a ajuda do Spring, especificamente falando do LdapTemplate. Para pesquisar utilizamos o método search.

package com.blogspot.diegopacheco.ldap.service;

import java.util.List;

import javax.naming.NamingException;
import javax.naming.directory.Attributes;

import org.springframework.ldap.core.AttributesMapper;
import org.springframework.ldap.core.LdapTemplate;

import com.blogspot.diegopacheco.ldap.pojo.Pessoa;

/**
* Classe que faz a pesquisa no ldap com o SpringLDAP.
*
* @author Diego Pacheco
* @since 07/12/2008
*
*/
public class PessoaLdapService {

private LdapTemplate ldapTemplate;

/**
* Metodo que procura uma pessoa em uma arvore LDAP v3.
*
* @return Pessoa
*/
@SuppressWarnings("unchecked")
public List findPessoas() {
return ldapTemplate.search("", "(objectclass=person)",2,new AttributesMapper() {
public Object mapFromAttributes(Attributes attrs) throws NamingException {

String uid = (String) attrs.get("uid").get();
String cn = (String) attrs.get("cn").get();

if (uid==null || uid.equals(""))
return null;           

Pessoa p = new Pessoa();
p.setNome(uid);
p.setCargo(cn);
return p;       

}
});
}

public LdapTemplate getLdapTemplate() {
return ldapTemplate;
}

public void setLdapTemplate(LdapTemplate ldapTemplate) {
this.ldapTemplate = ldapTemplate;
}

}

Como você pode ter percebido o código a cima é muito simples. O método search recebe como parâmetros a base para a pesquisa, ou seja , em que diretório as pesquisas irão iniciar, nesse caso foi passado como parâmetro "" o que significa que ele irá iniciar as pesquisa na raiz.

O próximo parâmetro é a própria query nesse caso "(objectclass=person)" significa que queremos todos as entradas que tenham a classe person. Finalmente implementamos uma AttributesMapper que é a maneira de mapearmos o resultado da query do ldap para pojos de nossa aplicação.

Agora vamos aos beans do Spring, nesse xml que é configurado os beans da aplicação. Bem como a conexão com o ApacheDS.




            

            









Aqui configuramos o bean org.springframework.ldap.core.LdapTemplate através de um org.springframework.ldap.core.support.LdapContextSource que é a classe para configurar a conexão com o LDAP. OBS: Perceba que eu modifiquei a senha do usuário administrador do LDAP para admin, você deverá fazer isso pelo apache Studio. para isso clique em cima do usuario uid=admin no schema ou=system e modifique a senha. Finalmente vamos a classe de testes. Para realizar os testes estou utilizando o Junit que vem junto ao eclipse 3.3.
package com.blogspot.diegopacheco.ldap.service.test;

import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.Assert;

import com.blogspot.diegopacheco.ldap.pojo.Pessoa;
import com.blogspot.diegopacheco.ldap.service.PessoaLdapService;

/**
* Classe de testes para  aplicacao.
*
* @author Diego Pacheco
* @since 07/12/2008
*/
public class PessoaLdapServiceTest {

private ApplicationContext ac;

@Before
public void setUp(){
ac = new ClassPathXmlApplicationContext("classpath:SpringLDAP-Beans.xml");
}

@Test
public void testFindPessoa(){
Assert.notNull(ac,"Contexto do Sping não pode ser null!");

PessoaLdapService pls = (PessoaLdapService)ac.getBean("pessoaService");
List p = pls.findPessoas();

Assert.notNull(p,"Não foi possivel acher o user no ldap.");
System.out.println("Pessoas: " + p);       

}

}

Nesse código a cima, estou Instanciando o contexto do Spring e obtendo o bean pessoaService e invocando o método findPessoas() que faz a devida query no ldap. Ao rodar esse código você deve estar com o Apache Studio aberto e com o Servidor no LDAP no ar. Você deve ver algo semelhante a figura a baixo como resultado. Bom é isso ai, espero que tenham gostado. Se você quiser pode baixar os fontes aqui. Abraços e até a próxima.

Popular posts from this blog

Kafka Streams with Java 15

Rust and Java Interoperability

HMAC in Java