Seguindo as etapas descritas abaixo, será possível:
- Instalar e configurar o IBM Tivoli Directory Server no Windows.
- Adicionar, modificar e excluir entradas e atributos LDAP na árvore usando um navegador LDAP e a linha de comando.
- Entender o conteúdo do arquivo LDIF (Lightweight Data Interchange Format).
- Escrever um programa Java simples para acessar as informações armazenadas no seu servidor do LDAP.
Conceitos básicos sobre o LDAP
O LDAP é usado para armazenar informações relativamente estáticas. A frase "grave uma vez, leia muitas vezes" descreve o melhor uso do LDAP. O LDAP é estruturado como diretório otimizado para buscas. Sua estrutura em árvore é útil para estruturas organizacionais de conceitualização.
Cada entrada da árvore LDAP é composta de uma ou mais classes de objeto. Cada classe de objeto tem atributos armazenados em pares nome/valor. Um exemplo de par nome/valor de atributo LDAP é uid=c0001.
O esquema LDAP especifica:
- As classes e nomes de objeto usados para entradas na árvore LDAP.
- Os nomes dos atributos e tipos de operações suportadas por cada atributo.
A estrutura da sua árvore LDAP se baseará em um esquema.
Figura 1. Estrutura geral de uma árvore LDAP
Pode-se localizar uma entrada em LDAP especificando o nome distinto (dn) ou o nome distinto relativo (rdn). O dn é o caminho completo da árvore LDAP enquanto rdn é apenas um identificador exclusivo para uma entrada específico da árvore.
Um modo de conceitualizar facilmente a diferença entre dn e rdn é pensar na diferença entre orientações e um endereço. O dn seria o equivalente a dar orientações do aeroporto ao hotel. O rdn seria o endereço do hotel. De modo similar a um endereço, rdn deve ser exclusivo. Seria muito difícil encontrar um hotel no mapa da cidade se seu endereço não fosse exclusivo.
Dados de funcionários armazenados no LDAP
Para o seu projeto, a configuração do LDAP será relativamente simples—uma lista linear de entradas de funcionários.
Crie os nomes distintos para os funcionários usando o atributo uid no nome distinto (dn). Por exemplo, o dn para a gerente Barbara Jensen é uid=c0001,ou=people,dc=ibm,dc=com. O valor para o uid é um ID de empresa exclusivo. Usando um ID de empresa em vez do nome é mais fácil fazer a manutenção do seu LDAP. Por exemplo, se Barbara se casar e mudar de nome para Barbara Jensen-Howard, bastará mudar dois atributos: cn=Barbara Jensen-Howard e sn=Jensen-Howard. Se cn=Barbara Jensen,ou=people,dc=ibm,dc=com tivesse sido usado como nome distinto, seria preciso excluir a entrada LDAP inteira e regenerá-la como cn=Barbara Jensen-Howard,ou=people,dc=ibm,dc=com. Pense também no caso de haver dois funcionários com o mesmo nome. O uso de ID da empresa evita colisões de nome na sua árvore LDAP.
Abaixo, há uma tabela com nomes de funcionários do Departamento de faturamento e seu nome correspondente encontrado no LDAP. A segunda coluna lista o dn do funcionário. A terceira coluna mostra o rdn
Tabela 1. Nomes distintos e distintos relativos dos funcionários no LDAP
| Nome do funcionário |
Nome distinto (dn) no LDAP
|
Nome distinto relativo (rdn) no LDAP
|
| Barbara Jensen | uid=c0001,ou=people,dc=ibm,dc=com | uid=c0001 |
| Stu Pretzman | uid=c0002,ou=people,dc=ibm,dc=com | uid=c0002 |
| Varad Singh | uid=c0003,ou=people,dc=ibm,dc=com | uid=c0003 |
| Steven Moyer | uid=c0004,ou=people,dc=ibm,dc=com | uid=c0004 |
| Carla VanDyke | uid=c0005,ou=people,dc=ibm,dc=com | uid=c0005 |
| Billy Parker | uid=c0006,ou=people,dc=ibm,dc=com | uid=c0006 |
Barbara Jensen é gerente do departamento de faturamento. As outras cinco entradas são de funcionários dela. Cada entrada no LDAP contém informações úteis sobre o funcionário, como número de telefonia, endereço de correspondência e e-mail.
Usaremos esses registros de funcionários do departamento de faturamento para preencher a árvore LDAP. Ao longo deste artigo vamos adicionar, modificar e excluir entradas LDAP desses registros de funcionários.
Configuração do IBM Tivoli Directory Server
A fim de aprender sobre LDAP, é útil ter um servidor do LDAP instalado no seu computador. As etapas a seguir demonstram como instalar o IBM Tivoli Directory Server no Windows.
Faça o download do IBM Tivoli Directory Server para Windows da IBM.
Descompacte o arquivo ZIP e instale-o em um diretório temporário. Na pasta ismp, clique duas vezes no ícone setup.exe para abrir o assistente. Escolha English como idioma do assistente de instalação. Aceite o contrato de licença.
Figura 2. Tela de boas-vindas
Escolha English como idioma. Nos painéis seguintes, será solicitada a instalação dos componentes do servidor de diretórios.
Figura 3. Idioma
Se DB2, GSKit ou WebSphere Application Server - Express Edition já estiver instalado, o assistente o detectará. Contudo, o DB2 deve estar instalado no mesmo servidor que seu servidor do LDAP. Caso contrário, será preciso instalar estes componentes. Instale a Web Administration Tool e o IBM WebSphere Application Server – Express embora não seja necessário tê-los disponíveis para concluir o exercício deste artigo. Clique em Next.
Figura 4. Recursos
A instalação do servidor do LDAP começará. Quando chegar a esse painel, clique no botão Next até chegar ao painel que pede para reiniciar seu computador.
Figura 5. Telas adicionais
No penúltimo painel, a configuração lhe pedirá para reiniciar o computador. Selecione o botão de opções Yes. Clique em Next.
Figura 6. Reiniciar o computador
Clique no botão Finish. O computador será reiniciado.
Figura 7. Reinicialização necessária do computador
Após a reinicialização do seu computador, faça o login novamente usando o mesmo ID do usuário. A IBM Tivoli Directory Server Configuration Tool será iniciada automaticamente.
Figura 8. Directory Server Configuration Tool
Clique na tarefa Administrator DN/password. Defina o ID de administrador como cn=root Enter ibm4root para a senha. Clique no botão OK.
Figura 9. Mudar DN e senha de administrador
O ID de administrador cn=root é o ID do usuário principal do LDAP e só deve ser usado para tarefas como modificações da árvore LDAP. Nunca deve ser fornecido a usuários LDAP.
Depois, escolha a tarefa Configure database. Escolha Create a new database. Clique no botão Next. Insira um ID de usuário e senha para o banco de dados. Clique em Next. Dê um nome ao banco de dados pcldap. Certifique-se de que o conjunto de códigos padrão (UTF-8/UCS-2) esteja selecionado. Clique em Next. Selecione uma letra de unidade. Clique no botão Next e depois em Finish. Após a conclusão da instalação do banco de dados, pressione o botão Close.
Figura 10. Configurar banco de dados
Selecione Manage suffixes na barra de tarefas. Digite dc=ibm, dc=com. Esse é o sufixo do esquema. Pressione o botão Add. Designaremos dc=ibm,dc=com como sufixo base do nosso grupo LDAP. Clique em OK para salvar as alterações. No futuro, é possível inserir sufixos base adicionais.
Figura 11. Gerenciar sufixos
Nesse ponto vamos preencher nosso LDAP com entradas de funcionários. Selecione Import LDIF data. Um arquivo LDIF (Lightweight Directory Interchange Format) é um formato de arquivo ASCII usado para carregar e salvar dados contidos em uma árvore LDAP. Além de conter as entradas de dados reais, um arquivo LDIF também contém os objetos usados para formar o esquema.
Procure o arquivo setup.ldif. Selecione a caixa de seleção Remove trailing spaces in Standard Import or Bulkload. Trata-se de uma Standard import. Clique no botão Import. Após a conclusão da importação, pressione Clear results. Depois, pressione o botão Close. O servidor do LDAP não pode estar em execução ao importarmos dados do LDIF usando a Directory Configuration Tool.
Figura 12. Importação dos dados do LDIF (Lightweight Directory Interchange Format)
Feche a Directory Server Configuration Tool selecionando, na barra de menus, File => Close.
Antes de iniciar o servidor do LDAP é preciso ter um endereço IP definido para ele. Se seu servidor tiver endereço IP estático, ignore esta etapa. Se ele não tiver endereço IP estático, há duas opções. Para qualquer opção, é preciso saber o nome do seu servidor. Digite hostname na linha de comando. Para usar a primeira opção, inicie um prompt de comandos e digite ipconfig.
Figura 13. Prompt de comandos - saída ipconfig
Digite esse endereço IP no seu arquivo <window os directory>\system32\drivers\etc\hosts. Reinicie seu servidor. Isso permitirá que seu servidor do LDAP seja executado e que outros servidores se conectem ao seu LDAP enquanto o endereço IP dinâmico continuar ligado ao seu computador. Lembre-se de remover essa entrada do arquivo de hosts após terminar os testes. Se seu servidor do LDAP estiver sendo usado apenas para desenvolvimento local, é possível implementar a segunda opção. Basta adicionar um alias para seu nome do servidor no endereço do host local 127.0.0.1. No arquivo <window os directory>\system32\drivers\etc\hosts, adicione a seguinte entrada. Esse alias de host local pode permanecer no seu arquivo de hosts.
| N.° para o teste de LDAP | |
| 127.0.0.1 | <aqui deve ser incluído o nome do seu servidor> |
Se não prestarmos atenção a esse aviso, sempre teremos inúmeros erros de ligação e o servidor do LDAP nunca vai iniciar.
É possível iniciar o servidor do LDAP a partir da linha de comando usando o comando <ldapinstalldir>\bin\ibmslapd.exe ou usar o painel Services. O servidor do LDAP é a entrada IBM Tivoli Directory Server V5.2 mostrada abaixo. Para algumas mudanças na configuração usando a IBM Tivoli Directory Server Configuration Tool é preciso parar o servidor de diretórios. O Admin Daemon nunca deve ser parado.
Figura 14. Admin Daemon é para administração de LDAP; o servidor de diretórios é o servidor do LDAP.
O Tivoli Directory Server tem um Web client que pode ser executado a partir do WebSphere Express Server. O arquivo WAR também pode ser instalado em um servidor WebSphere.
Adicionando uma entrada a partir da linha de comando
A IBM contratou uma nova funcionária chamada Susan Baker. Embora seja possível usar o navegador LDAP, uma entrada de funcionário tem atributos demais. É possível adicionar o funcionário usando o comando ldapadd e o arquivo addemployee.ldif. No diretório <ldapserver directory>\bin, digite o seguinte na linha de comando:
ldapadd -h ldap://<ldaphostname> -D "cn=root" -w ibm4root -f <ldif_directory_path>addemployee.ldif |
O arquivo LDIF usado para adicionar a funcionária Susan Baker é mostrado abaixo.
Listagem 1. Arquivo addemployee.ldif
# this is a comment the # must be in FIRST column
version: 1
## ------------------------------------------------------------------------------------
## ePerson is an AUXILLIARY objectclass from IBM and must
## have a STRUCTURAL objectclass (inetOrgPerson in this case)
##
## this is an entry sequence and is preceded by a blank line
dn: uid=c0007,ou=people,dc=ibm,dc=com
objectclass: ePerson
objectclass: inetOrgPerson
cn: Susan Baker
sn: Baker
givenName: Susan
initials: SAB
title: Billing worker
uid: c0007
userpassword: hellome1
mail: sbaker@ibm.com
mail: susan.baker@ibm.com
homephone: +1 999 111 3425
telephoneNumber: +1 999 555 1262
facsimileTelephoneNumber: +1 999 555 1292
mobile: +1 999 555 141
roomNumber: 0220
carLicense: 6ABDE3
o: ibm
ou: Billing
departmentNumber: 2604
registeredAddress: 348 Parkside Dr Anywhere, IL 23480
postalAddress: 347 Parkside Dr. Anywhere, IL 23480
employeeNumber: 9899
employeeType: full time
preferredLanguage: en
labeledURI: http://www-1.ibm.com/servers/eserver/iseries/ldap/schema/
|
Há vários benefícios de usar a linha de comando para carregar os arquivos LDIF em vez da Tivoli Directory Server Configuration Tool. A linha de comando é muito mais rápida do que a interface gráfica com o usuário. Também não é preciso parar o servidor do LDAP para carregar o arquivo LDIF. Parar um servidor do LDAP de produção pode causar rebuliço entre alguns usuários. Após executar ldapadd é preciso atualizar a árvore de diretórios no navegador do LDAP se quiser ver as atualizações. Selecione a entrada dc=ibm,dc=com e pressione o ícone Refresh.
Visualizando uma entrada a partir da linha de comando
Visualize sua atualização usando ldapsearch. A partir de uma linha de comando digite:
ldapsearch -h ldap://<ldaphostname> -D "cn=root" -w ibm4root -b "ou=people,dc=ibm,dc=com" "uid=c0007" |
O –b indica onde começar a pesquisa na árvore. Visto que você adicionou a entrada para Susan Baker em ou=people,dc=ibm,dc=com, comece a pesquisa naquele nível da árvore. Também é possível pesquisar a árvore inteira dc=ibm,dc=com em busca do registro de Susan usando:
ldapsearch -h ldap://<ldaphostname> -D "cn=root" -w ibm4root -b "dc=ibm,dc=com" "uid=c0007" |
Excluindo uma entrada a partir da linha de comando
O funcionário Billy Parker passou vários dias tentando instalar o IBM Tivoli Directory Server em um servidor que não tinha endereço IP estático e não atualizou seu arquivo de hosts. Sua gerente, Barbara, descobriu sua incompetência e Billy foi demitido. Remova-o do LDAP da empresa usando o comando ldapdelete.
ldapdelete -h ldap://<ldaphostname> -D "cn=root" -w ibm4root "uid=c0006,ou=people,dc=ibm,dc=com" |
Modificando uma entrada a partir da linha de comando
A gerente do departamento de faturamento, Barbara Jensen, se mudou para uma nova casa e seu número do telefone também mudou para +1 999 222 3423. Ela também acrescentou outra linha telefônica no trabalho, +1 999 243 2312, e colocou sua foto no Web site da empresa. Atualize seu registro de funcionário usando a seguinte linha.
ldapadd -h ldap://<ldaphostname> -D "cn=root" -w ibm4root -f <ldif_directory_path>modifyemployee.ldif |
O arquivo LDIF para modificar a entrada de Barbara Jensen é mostrado abaixo. O – no arquivo permite múltiplas atualizações de atributo.
Listagem 2. Arquivo modifyemployee.ldif
# this is a comment the # must be in first column
version: 1
## -----------------------------------------------------------
## ePerson is an AUXILLIARY objectclass from IBM and must
## have a STRUCTURAL objectclass (inetOrgPerson in this case)
## - Modify the Barbara Jensen entry setup in setup.ldif.
#
# Change her telephones and add a jpg.
#
## this is an entry sequence and is preceded by a blank line
dn: uid=c0001,ou=people,dc=ibm,dc=com
changetype: modify
add: telephonenumber +1 999 243 2312
telephonenumber: +1 999 243 2312
-
replace: homephone
homephone: +1 999 222 3423
-
add: jpegphoto
jpegphoto: http://www.ibm.com/photo/babs.jpg
|
Formato das operações de linha de comando
O formato geral dos comandos LDAP discutidos é mostrado na tabela abaixo.
Tabela 2. Operações da linha de comando LDAP
| Operação | Formato |
| Adicionar ou Modificar | ldapadd -h ldap://<ldaphostname> -D <DN raiz> -w <senha raiz> -f <ldif_file_path> |
| Procurar | ldapsearch -h ldap://<ldaphostname> -D <DN raiz> -w <senha raiz> -b <DN de pesquisa base> <DN de pesquisa> |
| Excluir | ldapdelete -h ldap://<ldaphostname> -D <DN raiz> -w <senha raiz> <DN a ser excluído> |
Exibindo os dados do LDAP a partir do Internet Explorer
Um recurso interessante associado ao Internet Explorer é um catálogo de endereços ligado ao seu servidor do LDAP. Abra o Internet Explorer e digite a seguinte URL na sua barra de endereço.
ldap://<ldaphostname>/ou=people,dc=ibm,dc=com??one?(objectclass=*) |
O programa Address Book do Internet Explorer é aberto, permitindo ver os funcionários do seu catálogo de endereços.
Figura 15. Endereço do Internet Explorer
Visão geral do formato de arquivo LDIF
O Lightweight Data Interchange Format (LDIF) é usado para representar entradas LDAP em formato de texto simples. Esta seção fornece uma breve descrição do formato de entrada LDIF.
A forma básica de uma entrada é mostrada abaixo. Uma sequência de entrada é precedida por uma linha em branco. Um comentário é indicado por um # na primeira coluna. Além disso, um espaço deve vir após : em um atributo.
# comment line
|
dn: <distinguished name>
|
<attrdesc>: <attrvalue>
|
<attrdesc>: <attrvalue>
|
<attrdesc>: <attrvalue>
|
...
|
Revisão do arquivo addemployee.ldif de Susan Baker.
Listagem 3. Arquivo addemployee.ldif
# this is a comment the # must be in FIRST column
version: 1
## -----------------------------------------------------------------
## ePerson is an AUXILLIARY objectclass from IBM and must
## have a STRUCTURAL objectclass (inetOrgPerson in this case)
##
## this is an entry sequence and is preceded by a blank line
dn: uid=c0007,ou=people,dc=ibm,dc=com
objectclass: ePerson
objectclass: inetOrgPerson
cn: Susan Baker
sn: Baker
givenName: Susan
initials: SAB
title: Billing worker
uid: c0007
userpassword: hellome1
mail: sbaker@ibm.com
mail: susan.baker@ibm.com
homephone: +1 999 111 3425
telephoneNumber: +1 999 555 1262
facsimileTelephoneNumber: +1 999 555 1292
mobile: +1 999 555 141
roomNumber: 0220
carLicense: 6ABDE3
o: ibm
ou: Billing
departmentNumber: 2604
registeredAddress: 348 Parkside Dr Anywhere, IL 23480
postalAddress: 347 Parkside Dr. Anywhere, IL 23480
employeeNumber: 9899
employeeType: full time
preferredLanguage: en
labeledURI: http://www-1.ibm.com/servers/eserver/iseries/ldap/schema/
|
As linhas que começam com um caractere # são comentários. É possível ter múltiplos caracteres #, mas eles devem ser seguidos por um espaço. O número da versão é tal que é possível acompanhar as mudanças no arquivo. A primeira linha da sequência de entrada é o nome distinto (dn). O atributo uid é a chave usada para localizar essa entrada na árvore. Assim, o nome distinto relativo (rdn) para essa entrada seria uid=c0007. A entrada de Susan Baker se localiza sob a unidade de organização da pessoa (ou). A unidade organizacional da pessoa se localiza sob a entrada de base dc=ibm,dc=com.
As próximas duas linhas definem a classe de objeto da entrada que contém as informações sobre Susan Baker. Os esquemas LDAP base lhe fornecem o objeto inetOrgPerson para armazenar informações sobre uma pessoa. Contudo, ele não dispõe de muitos atributos necessários no ambiente de negócios atual. Por exemplo, inetOrgPerson não tem um atributo para telefone celular. O IBM Tivoli Directory Server fornece uma classe auxiliar, ePerson, que tem muitos atributos úteis, como mobile e postalAddress. Uma lista completa de todos os esquemas fornecidos pela IBM pode ser baixada do repositório de esquema Tivoli.
O restante do arquivo LDIF contém vários atributos pessoais de Susan Baker.
Acessando dados de LDAP usando Java
Java fornece uma excelente estrutura para acessar os dados armazenados em LDAP. O procedimento é similar a outros tipos de acesso a recurso remoto. Abre-se uma conexão com o servidor do LDAP. É executada uma operação, como leitura, gravação ou exclusão. A conexão é fechada.
A Java Naming and Directory Interface (JNDI) é usada para acessar o servidor do LDAP. Um objeto DirContext é a conexão pela qual o programa Java se conecta ao LDAP. Usar o DirContext é simples. Construa um objeto Properties com a URL do servidor do LDAP, o nome e senha de usuário raiz, e vários itens Java de manutenção (factory de contexto, entidade de segurança e indicação). Esse objeto Properties é passado para o construtor de DirContext.
Todos os fragmentos mencionados abaixo se referem ao código de origem no programa TestLDAP.java.
//-------------------------------------------------- // Set up the environment for creating the initial context //-------------------------------------------------- Properties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); props.setProperty(Context.PROVIDER_URL, "ldap://<lpadserver>:389"); props.setProperty(Context.URL_PKG_PREFIXES, "com.sun.jndi.url"); props.setProperty(Context.REFERRAL, "ignore"); props.setProperty(Context.SECURITY_AUTHENTICATION, "simple"); // -------------------------------------------------- //specify the root username // -------------------------------------------------- props.setProperty(Context.SECURITY_PRINCIPAL, "cn=root"); //-------------------------------------------------- //specify the root password // -------------------------------------------------- props.setProperty(Context.SECURITY_CREDENTIALS, "ibm4root"); //-------------------------------------------------- // Get the environment properties (props) for creating initial // context and specifying LDAP service provider parameters. //-------------------------------------------------- DirContext ctx = new InitialDirContext(props); |
Depois de estabelecer uma conexão com o servidor do LDAP, é possível pesquisar na árvore uma entrada correspondente ou atributos.
Primeiro é preciso configurar algumas restrições para sua pesquisa. No programa TestLDAP.java, as restrições são todas configuradas como SUBTREE_SCOPE.
SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); |
Abaixo, uma tabela de todas as variáveis de parâmetro de escopo suportadas por setSearchScope().
Tabela 3. Parâmetros setSearchScope()
Valores para setSearchScope()
| O que faz |
SUBTREE_SCOPE
| Inicia a entrada de base e a pesquisa, além de tudo que estiver abaixo dela. Essa é a pesquisa mais lenta e extensa. |
ONELEVEL_SCOPE
| Pesquisa nas entradas abaixo da entrada de base. |
OBJECT_SCOPE
| Pesquisa apenas a entrada de base. Essa é a pesquisa mais rápida e menos extensa. |
A próxima etapa é configurar os atributos de entidade que serão preenchidos em resultado da pesquisa. Visto que todas as entidades interessantes pertencem ao esquema ePerson, o campo de atributo retornado é definido para um array de todos os atributos ePerson possíveis.
constraints.setReturningAttributes(EPERSON_ATTRIBUTE_LIST); |
A seguir, é feita a pesquisa. A definição BASE_SEARCH acabou de ser configurada para ou=people,dc=ibm,dc=com, que é o pai da árvore de funcionários. Diferentes formatos de filtros de pesquisa também são especificados na origem.
NamingEnumeration results = ctx.search(BASE_SEARCH, filter, constraints); |
O filtro de pesquisa pode ter qualquer um dos seguintes formatos.
Tabela 4. Filtros de pesquisa
| Símbolo | Filtro | Exemplo | Correspondências aos exemplos |
~=
| Aproximação |
sn~=Jensen
| Qualquer variação em Jensen |
=
| Igualdade |
sn=Jensen
| Corresponde apenas ao sobrenome Jensen. Esse é o formato de pesquisa mais comum. |
>
| Maior que |
sn>Jensen
| Qualquer sobrenome que vem alfabeticamente após Jensen, p.ex., Pretzman. |
>=
| Maior ou igual |
sn>=Jensen
| Sobrenome correspondente a Jensen ou que venha após este alfabeticamente. |
<
| Menor que |
sn<Jensen
| Sobrenome antes de Jensen, p.ex., Baker |
<=
| Menor ou igual |
sn<=Jensen
| Sobrenome correspondente ou precedente a Jensen. |
=*
| Presença do atributo |
sn=*
| Qualquer entrada que contenha um atributo sn. |
*
| Correspondência à cadeia de caractere curinga |
sn=Jen*n
| Qualquer cadeia de caractere, subcadeia ou supercadeia correspondente a Jensen. |
&
| E |
(&(sn=Jensen) (initials=BJJ))
| Qualquer entrada que corresponda a todas as condições. Nesse caso, o sobrenome Jensen com as iniciais BJJ. |
|
| Ou |
(|(sn=Jensen) (initials=BJJ))
| Qualquer entrada que corresponda a uma condição. O sobrenome Jensen ou as iniciais BJJ |
!
| Não |
(sn=Jensen)
| A negativa da condição incluída. Todos os sobrenomes, exceto Jensen. |
Após a pesquisa, o programa faz a iteração pelo conjunto de resultados usando o NamingEnumeration retornado pelo contexto. Cada atributo é impresso.
if (results.hasMoreElements())
{
System.out.println(" has returned results..\n");
bFoundIt = true;
// Since UID is unique across the entire directory,
// the search results should contain only one entry.
SearchResult sr = (SearchResult) results.next();
// ---------------------------------------------
// Get all available attribute types and their associated
// values and print them out.
// ---------------------------------------------
printAttributes(sr.getAttributes());
}
else
{
System.out.println(" has returned no results..");
}
|
O código para atualizar os atributos de uma entrada é similar para a pesquisa. Primeiro, o programa deve encontrar a entrada a ser atualizada da mesma maneira de pesquisa descrita acima. Nesse ponto, os atributos da entrada podem ser alterados, adicionados ou removidos. O objeto ModificationItem é usado para alterar o atributo representado pelo objeto BasicAttribute.
// Get all available attribute types and their associated
// values.
Attributes attributes = sr.getAttributes();
// Specify the changes to make
ModificationItem[] mods = new ModificationItem[1];
// -------------------------------------------
// remove the attribute
// -------------------------------------------
if (bRemoveAttribute) {
// eliminate the attribute
if (null != attributes.get(attrName)) {
mods[0] = new ModificationItem(
DirContext.REMOVE_ATTRIBUTE,
new BasicAttribute(attrName, attrVal));
}
}
// -------------------------------------------
// replace or add the attribute
// -------------------------------------------
else {
// do a replace of the attribute
if (null != attributes.get(attrName)) {
mods[0] = new ModificationItem(
DirContext.REPLACE_ATTRIBUTE,
new BasicAttribute(attrName, attrVal));
}
// add the attribute
else {
mods[0] = new ModificationItem(
DirContext.ADD_ATTRIBUTE, new BasicAttribute(
attrName, attrVal));
}
}
ctx.modifyAttributes(updateDN + "," + BASE_SEARCH, mods);
|
Após executar qualquer operação no servidor do LDAP, é preciso fechar a conexão. Colocando a chamada de fechamento em um bloco finally, garantimos que a conexão LDAP sempre será fechada.
//always close the directory context when you are done
finally {
try {
if (null != ctx)
ctx.close();
} catch (Exception e2) {
}
}
|
Executar o programa de amostra
Para executar o programa de amostra do LDAP, digite java -jar createLDAP.jar em uma linha de comando.
Se você chegou até este ponto, deve ter conhecimento de trabalho sobre o LDAP. Você entende o conceito de nomes distintos e distintos relativos. Conhece as etapas para instalar o IBM Tivoli Directory Server. É possível adicionar, modificar ou excluir entradas LDAP usando o navegador LDAP e a linha de comando. Entende o formato de arquivo LDIF. Por fim, aprendeu a usar JNDI para acessar programaticamente seu servidor do LDAP.
Aprender
-
O IBM Tivoli Directory Server para Windows está disponível por meio da IBM.
-
O Web site de esquema do IBM Tivoli contém informações sobre todos os esquemas incluídos no IBM Tivoli Directory Server.
-
O IBM Redbook Understanding LDAP - Design and Implementation pode lhe fornecer orientações práticas.
-
Para aprender mais sobre o interessante mundo do LDAP, torne-se um LDAP Guru. Esse é o recurso LDAP definitivo na Web.
-
Obtenha mais informações sobre o IBM Tivoli Directory Server na comunidade do developerWorks participando do fórum do developerWorks.
Discutir
- Siga o developerWorks no Twitter.
- Envolva-se na comunidade My developerWorks.