Componente de autenticação LDAP para VRaptor 3

Boa noite a todos,

Depois de me bater um tempo na busca por vários sites por aí, consegui montar uma solução de autenticação LDAP que atendeu a minha necessidade aqui:

  • Projeto WEB com VRaptor 3;
  • Spring como contêiner de injeção de dependências;
  • Regra de acesso, permissões e gerenciamento de usuários personalizada (sem Spring Security);

Bom, basicamente para não ficar muito perdido como eu fiquei, primeiramente é necessário que seja entendido como que funciona o LDAP, a sua estrutura básica da árvore dos contatos, ideia do serviço, e talz, acho que a página abaixo vai explicar melhor:

http://www.vivaolinux.com.br/artigo/Entendendo-o-LDAP

Basicamente, o que eu pensei inicialmente foi de usar o próprio Spring para fazer isso, assim procurei pelo pacote Spring-LDAP, só que acabei me enrolando um pouco quanto as suas dependências, inclusive a Spring-DAO que tinha achado nos repositórios Maven. Por fim procurei entender o que realmente queria no LDAP, que era apenas autenticar os usuários e obter os dados como nome e telefone através de um AJAX no formulário de cadastro do usuário (sincronizar com o servidor LDAP).

Desta forma achei uma solução feita em ‘Java puro’ ou seja, sem a necessidade de nenhum framework ou biblioteca adicional ao meu projeto, apenas usando os recursos do pacote ‘java.naming’.

Conceito

A autenticação do usuário no LDAP ocorre em duas etapas, a primeira é em você obter o Domain Name (DN) do usuário a partir de alguma informação do mesmo, uma que seja única como o login, o resultado que você terá será a posição do usuário na árvore de registros:

uid=carlos,ou=usuarios-correio,dc=carlos4web,dc=wordpress,dc=com

Onde o tronco da árvore começa pelo “br->inf->carlos->usuarios-correio->{uid:carlos}, isso numa leitura ou quem conhece sobre LDAP ficaria mais claro.

Seguindo com a implementação Java, primeiro obtemos o DN de onde está o usuário, depois re-conectamos ao servidor LDAP só que fazendo um acesso autenticado onde o login seria o DN obtido do usuário e a senha que o mesmo informou no formulário de login da nossa aplicação.

Até agora temos isso:

  1. Consulta anônima para obter o DN do usuário a se autenticar;
  2. Consulta autenticada com o DN obtido e a senha informada pelo usuário no sistema;

Codificação

A classe Usuario do nosso exemplo:

Para uma melhor leitura, os getters e setters não serão postados nos trechos de código, em anexo a este post deixo o download das classes do exemplo.

Para trabalhar com o resultado do método getUserDetails do componente eu uso uma classe estendendo da classe Usuario, a classe LDAPUserProxy, que recebe em seu construtor um objeto javax.naming.directory.SearchResult como dependência direta no construtor. Assim ao ser instanciado passamos o resultado da consulta e o objeto já estará com os dados populados no bean Usuario. Classe LDAPUserProxy:

Por fim temos o nosso componente, que nos dá um front-end para essa lógica toda. Abaixo segue a estrutura do mesmo:

Conclusão

O maior problema que tive para desenvolver esse componente foi basicamente em entender a lógica do modo de usar o LDAP já o outro porém era achar uma referência Java de como manipular o LDAP.

Enfim, este é o componente que eu fiz para resolver o problema que eu tinha para integrar o acesso dos usuários aqui da empresa por meio do serviço LDAP existente.

Dica

Para quem está implementando agora o LDAP, vale lembrar que você precisa ter um usuário local na sua aplicação, ou seja, o usuário Carlos do LDAP deve estar cadastrado no seu banco de dados, só que sem senha por exemplo, porque no LDAP não tem como filtrar quem vai acessar a sua aplicação, ou seja, todos os usuários da árvore do LDAP poderiam acessar. E também por regra de banco de dados relacional, você precisa ter o usuário localmente no banco para fazer as referências de login, relacionamento, etc.

Código fonte

http://www.mediafire.com/file/fpv8v1xxf64ptcx/ldap-tutorial.zip

Blog Java