<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Roberto Furutani &#187; ldap</title>
	<atom:link href="http://www.furutani.com.br/tag/ldap/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.furutani.com.br</link>
	<description>O site de um computólogo curioso!</description>
	<lastBuildDate>Fri, 20 Jan 2012 00:25:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Autenticação e obtenção de dados via LDAP</title>
		<link>http://www.furutani.com.br/2008/09/autenticacao-e-obtencao-de-dados-via-ldap/</link>
		<comments>http://www.furutani.com.br/2008/09/autenticacao-e-obtencao-de-dados-via-ldap/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 00:58:03 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[ldap]]></category>

		<guid isPermaLink="false">http://www.furutani.eti.br/wordpress/?p=84</guid>
		<description><![CDATA[Olá! O LDAP (Lightweight Directory Access Protocol) é um protocolo de padrão aberto e multiplataforma muito usado em empresas nos serviços de autenticação e autorização a sistemas operacionais e aplicativos. Existem vários softwares que implementam esse protocolo, o OpenLDAP é um exemplo open source e o Windows Server 2003 Active Directory é um exemplo pago. [...]]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>O LDAP (Lightweight Directory Access Protocol) é um protocolo de padrão aberto e multiplataforma muito usado em empresas nos serviços de autenticação e autorização a sistemas operacionais e aplicativos. Existem vários softwares que implementam esse protocolo, o <a href="http://www.openldap.org/" target="_blank">OpenLDAP</a> é um exemplo open source e o Windows Server 2003 Active Directory é um exemplo pago.</p>
<p>Podemos imaginar um servidor LDAP como um banco de dados, mas um banco de dados que não tem SQL, transação, commit e etc. e que os dados são organizados na forma de árvore (igual a árvore genealógica ou a árvore de diretórios que você tem no seu computador) dessa forma os dados podem ser organizados e agrupados mais facilmente.</p>
<p>As informações só podem ser armazenadas de forma não-normalizada, ou seja os dados de um item é um único registro. Exemplo: Para armazenar os dados de um usuário [nome, email e departamento] em um banco de dados relacional com certeza você criaria um cadastro de departamentos e amarraria o usuário com o ID do departamento, usando LDAP isso não é possível, todos esses dados ficarão em uma única &#8220;<em>tabela</em>&#8220;. Por isso eu usei o termo não-normalizada no início do parágrafo.</p>
<p>Um dos motivos mais comuns para implantar um servidor LDAP é para o login único para todos os aplicativos, facilitando a vida dos usuários que não precisam mais decorar uma senha para acessar cada aplicação. Esse login unificado ou único também é conhecido como Single SignOn</p>
<p>Nesse link você pode aprender mais sobre <a href="http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol" target="_blank">LDAP</a>.<br />
Abaixo veremos como acessar um servidor LDAP para buscar algumas informações de um usuário, o exemplo serve para validar a senha e trazer dados do servidor, mas não serve para apagar um registro ou atualizar um registro.</p>
<p><strong>Classe TesteLDAP &#8211; Essa classe verifica se o usuário e a senha estão corretos, se estiverem exibe os dados retornados<br />
</strong></p>
<pre class="brush: java">package br.com.furutani.ldap.cliente;

import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchResult;

import br.com.furutani.ldap.servicelocator.LDAPParametrosConfig;
import br.com.furutani.ldap.servicelocator.LDAPServiceLocator;

/**
* Classe de teste que efetua um busca simples em um repositório LDAP
*
*/

public class TesteLDAP {

public static void main(String[] args) {

// ////////////////////
// Inicialmente há apenas esse usuario
String login = &quot;desenvolvedor&quot;;
String senha = &quot;desenv&quot;;
// ///////////

DirContext ctx = LDAPServiceLocator.getInstance().getContext();

Attributes matchAttrs = new BasicAttributes(false);

// Array de atributos que deseja retornar do LDAP
String[] atributosRetorno = new String[] { &quot;mail&quot;, &quot;cn&quot; , &quot;userPassword&quot;};

// Parametros de busca
matchAttrs.put(new BasicAttribute(&quot;uid&quot;, login));
matchAttrs.put(new BasicAttribute(&quot;userPassword&quot;, senha));

System.out.println(&quot;Buscando...&quot;);

try {
// Efetua a busca

NamingEnumeration resultado = ctx.search(
LDAPParametrosConfig.SEARCHBASE, matchAttrs,
atributosRetorno);

// Exibindo o resultado, se houver
while (resultado.hasMore()) {

SearchResult sr = (SearchResult) resultado.next();
// Obtem os atributos
Attributes atributos = sr.getAttributes();

for (NamingEnumeration todosAtributos = atributos.getAll(); todosAtributos
.hasMore();) {
Attribute attrib = (Attribute) todosAtributos.next();
String nomeAtributo = attrib.getID();
System.out.println(&quot;Atributo:&quot; + nomeAtributo);

// Exibe todos os valores do atributo
for (NamingEnumeration e = attrib.getAll(); e.hasMore();) {
System.out.println(&quot;\tvalor:&quot; + e.next());

}
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(&quot;Busca finalizada.&quot;);
}

}</pre>
<p><strong>Classe LDAPServiceLocator &#8211; Localiza o servidor LDAP<br />
</strong></p>
<pre class="brush: java">package br.com.furutani.ldap.servicelocator;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

/**
 * Classe responsavel por localizar um contexto de diretório LDAP
 */
public class LDAPServiceLocator {

	protected static LDAPServiceLocator instance;

	private LDAPServiceLocator() {
		super();
	}

	/**
	 * Obtem a mesma instancia de LDAPServiceLocator para todas as chamadas
	 * (Classe singleton)
	 *
	 * @return um objeto LDAPServiceLocator
	 */
	public static LDAPServiceLocator getInstance() {

		if (instance == null) {
			instance = new LDAPServiceLocator();
		}

		return instance;
	}

	public DirContext getContext() {

		Hashtable env = new Hashtable(2);

		// Especifica a fabrica de INITIAL CONTEXT
		env.put(Context.INITIAL_CONTEXT_FACTORY,
				LDAPParametrosConfig.INITIAL_CTX);

		// Especifica o IP/Nome e a porta do servidor LDAP
		env.put(Context.PROVIDER_URL, LDAPParametrosConfig.SERVIDOR);

		// As linhas abaixo são usadas quando o servidor LDAP não permite busca como anonymous
		//env.put(Context.SECURITY_PRINCIPAL, LDAPParametrosConfig.ADMIN_DN );
		//env.put(Context.SECURITY_CREDENTIALS, LDAPParametrosConfig.ADMIN_PW );

		DirContext ctx = null;

		try {
			// Obtem um Initial Context
			ctx = new InitialDirContext(env);
		} catch (NamingException e) {
			System.out.println(&quot;Não foi possivel obter um contexto LDAP&quot;);
			e.printStackTrace();
		}

		return ctx;
	}
}</pre>
<p><strong>Classe LDAPParametrosConfig &#8211; Possuí constantes de configuração.<br />
</strong></p>
<pre class="brush: java">package br.com.furutani.ldap.servicelocator;

/**
 * Paramêtros de configuração do LDAP
 *
 */

public class LDAPParametrosConfig {

	/*
	 * Implementação do Initial context para LDAP
	 */
	public static final String INITIAL_CTX = &quot;com.sun.jndi.ldap.LdapCtxFactory&quot;;

	/*
	 * Servidor LDAP
	 */
	public static final String SERVIDOR = &quot;ldap://172.31.1.165:389&quot;;

	/*
	 * Base de busca
	 */
	public static final String SEARCHBASE = &quot;ou=users, dc=furutani, dc=com, dc=br&quot;;
	/*
	 * Nome do usuário do admin
	 */
	public static final String ADMIN_DN = &quot;dc=furutani, dc=com, dc=br&quot;;

	/*
	 * Senha
	 */
	public static final String ADMIN_PW = &quot;123456&quot;;

	/*
	 *  “top level” do diretório (base DN)
	 */

	public static final String BASE_DN = &quot;dc=furutani, dc=com, dc=br&quot;;
}</pre>
<p>Espero ter ajudado.<br />
Até mais,<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2008/09/autenticacao-e-obtencao-de-dados-via-ldap/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

