Use o Ruby on Rails para criar um serviço de diretório LDAP no Tivoli Directory Server V6.0

Incluir, atualizar, pesquisar e excluir entradas de diretório com Net::LDAP Ruby gem

Neste artigo, aprenda a usar a biblioteca Net::LDAP para criar um serviço de diretório Lightweight Directory Access Protocol (LDAP) no servidor de diretórios IBM® Tivoli® Directory Server V6.0. Percorra os exemplos para incluir, modificar, procurar e excluir uma entrada de diretório com a biblioteca Net::LDAP Ruby. Crie um aplicativo Ruby on Rails usando o Tivoli Directory Server V6.0 como um banco de dados de backend.

Deepak Vohra, Web Developer, Greater Detroit

Deepak Vohra é um Programador de Java e Desenvolvedor de Componente da Web Certificado pela Sun. Deepak já publicou no XML Journal, no onjava.com e no WebLogic Developer's Journal.


nível de autor Contribuidor do
        developerWorks

28/Abr/2009

Apresentação

O Tivoli Directory Server é um servidor de diretório baseado em LDAP V3 usado para criar serviços de diretórios. Um serviço de diretório é um aplicativo que armazena, recupera e modifica informações sobre recursos de rede. O LDAP, um protocolo leve para acessar serviços de diretório, é baseado em entradas. Uma entrada é um conjunto de atributos identificado por um nome distinto (DN) globalmente exclusivo. Cada atributo de entrada de diretório tem um tipo e um ou mais valores. Neste artigo, aprenda a usar a biblioteca Net::LDAP para criar um serviço de diretório LDAP no servidor de diretório Tivoli Directory Server V6.0. Percorra um exemplo para criar um aplicativo Ruby on Rails usando o Tivoli Directory Server V6.0 como um banco de dados de backend.

Pré-requisitos e requisitos do sistema

É necessário ter um conhecimento básico do LDAP e das linguagens de script. Este artigo se destina principalmente àqueles que sabem um pouco sobre o LDAP e necessitam gravar um serviço de diretório usando a linguagem de script Ruby. Para executar os exemplos neste artigo, o Tivoli Directory Server V6.0 deve estar instalado. Faça o download do aplicativo LDAP de exemplo para este artigo.


Sobre o Ruby on Rails

Ruby on Rails é uma estrutura da Web de software livre para desenvolvimento de aplicativos da Web baseados em um banco de dados. O Ruby on Rails fornece facilidade de desenvolvimento, suporte para Ajax e uma estrutura Model-View-Controller (MVC). O Ruby é uma linguagem interpretada de script orientada a objetos. Interpretativo sugere que um aplicativo Ruby é executado sem antes compilar o aplicativo. As variáveis em Ruby não têm um tipo; uma variável Ruby pode conter dados de qualquer tipo. As variáveis em Ruby não precisam de declarações de variáveis. O Ruby, sendo uma linguagem orientada a objetos, apresenta recursos como classes, métodos e heranças.

Para desenvolver um aplicativo Ruby on Rails, são necessários um servidor da Web e um banco de dados. O Rails inclui um servidor da Web incorporado denominado WEBrick. O Rails é configurado com o banco de dados MySQL por padrão. Rails é uma combinação dos seguintes subprojetos.

Modelo— Registro Ativo
Modelos modelam os objetos de negócios de modelo em um aplicativo MVC. No Rails, os modelos normalmente se baseiam no padrão Registro Ativo, que fornece o object-relation mapping (ORM) entre objetos de negócios e um banco de dados.
Visualização— Visualização de Ação
As visualizações são as interfaces com o usuário de um aplicativo da Web do Ruby on Rails. Uma visualização é renderizada usando o RHTML ou o RXML. O RHTML é o HTML incorporado no Ruby e o RXML é o XML gerado pelo Ruby. Uma visualização contém links para métodos (ações) definidos no controlador com os quais as ações do controlador são chamadas.
Controlador — Controlador de Ações
O controlador configura as variáveis de instância necessárias para uma visualização e renderiza uma visualização. O controlador é uma classe que estende a classe ApplicationController e consiste em ações (métodos). Um controlador integra o modelo à visualização usando métodos públicos (ações).

O modelo fornece os dados, o controlador fornece a lógica de negócios para processar os dados e a visualização apresenta os dados.

Um aplicativo MVC Rails é composto pelos seguintes arquivos de Ruby, RHTML e configuração:

  • Modelos de visualização (arquivos .rhtml) no diretório app/views
  • Classe de modelo no diretório app/models
  • Classe de controlador no diretório app/controllers
  • Arquivo de Configuração de Banco de Dados (database.yml) no diretório de configuração

O Ruby on Rails fornece os comandos para geração de scripts do modelo e do controlador. Alguns dos comandos do Ruby on Rails comumente usados são mostrados abaixo.

Tabela 1. Comandos comuns do Ruby on Rails
Comando (variáveis em itálico)Descrição
rails applicationnameCria o aplicativo Rails do nome especificado
ruby script/serverInicia o servidor da Web do Ruby Rails WEBrick em http://localhost:3000
ruby script/generate model modelnameGera uma classe de modelo do nome de modelo especificado
ruby script/generate controller controllername
controlleraction1
controlleraction2
...
Gera uma classe de controlador do nome especificado e as ações do controlador (se especificadas); também são gerados modelos de visualização (arquivos .rhtml) correspondentes às ações do controlador

O Ruby on Rails fornece várias bibliotecas do Ruby para desenvolvimento de aplicativos LDAP. Por exemplo:

  • O Ruby/ActiveLDAP apresenta uma interface orientada a objetos para o LDAP com as entradas do LDAP mapeadas aos objetos do Ruby.
  • A Net::LDAP é uma biblioteca do Ruby de suporte para LDAP e suporta os recursos do cliente LDAP.

Neste artigo, aprenda a usar a biblioteca Net::LDAP para criar um serviço de diretório no servidor de diretório Tivoli Directory Server V6.0. Você incluirá, modificará, procurará e excluirá uma entrada de diretório com a biblioteca Net::LDAP Ruby


Instalação

Esta seção aborda como instalar o Ruby, a estrutura do Rails e o RubyGems. O RubyGems é o gerenciador de pacotes padrão do Ruby usado com os aplicativos e bibliotecas do Ruby. Você também instalará a Net::LDAP, a biblioteca da classe do Ruby para LDAP. O aplicativo de exemplo usa a plataforma Windows®. A ordem de instalação é instalar, primeiro, o Ruby, em seguida, o Rails e, por fim, a NET::LDAP.

Instalação básica do Ruby

Para instalar a última versão do Ruby e do RubyGems:

  1. Faça download do aplicativo Ruby Windows Installer. O Ruby V1.8.5-21 foi usado para desenvolver o aplicativo de serviço de diretório do exemplo neste artigo.
  2. Dê um clique duplo no aplicativo ruby185-21.exe. O Assistente de Configuração do Ruby será iniciado.
  3. Clique em Avançar e aceite o contrato de licença. Selecione os componentes padrão a serem instalados, inclusive o gerenciador de pacotes RubyGems, e clique em Avançar.
  4. Especifique o diretório de instalação do Ruby (o padrão é c:/ruby) e clique em Avançar.
  5. Clique em Instalar. O Ruby e o RubyGems serão instalados.

Rails

Instale o Rails:

  1. Vá para o diretório (Cd) c:/ruby onde o Ruby está instalado.
  2. Execute o comando a seguir para instalar o Rails e suas dependências: c:/ruby>gem install rails --include-dependencies.

O pacote Net::LDAP

Instale o ruby-net-ldap gem com:

C:/ruby>gem install ruby-net-ldap

A classe Net::LDAP fornece uma implementação do Ruby do protocolo cliente LDAP. A classe Net::LDAP é usada pelas operações ligar, procurar, incluir, modificar, excluir e renomear. Os métodos da classe Net::LDAP estão descritos na Tabela 2.

Tabela 2. Métodos da classe Net::LDAP
MétodoDescrição
add(args)Inclui uma nova entrada de diretório. Os argumentos são:
  • :dn — DN (nome distinto) da nova entrada
  • :attrs — Atributos da nova entrada especificados como um hash
add_attribute(dn, atributo, valor)Inclui um valor em um atributo. Se o atributo especificado ainda não está definido, cria um novo atributo.
authenticate(nome_de_usuário, senha)Especifica as credenciais de autenticação para o servidor do LDAP.
bind(auth=@auth)Conecta o servidor do LDAP e solicita autenticação baseada nas credenciais de autenticação especificadas no método aberto ou novo método. Retorna true quando a conexão com o servidor do LDAP é estabelecida.
bind_as(args={})Liga-se como um usuário específico.
delete(args)Exclui uma entrada de diretório de um DN especificado, aliás, o único argumento suportado.
delete_attribute(dn, atributo)Exclui um atributo e todos os seus valores. O parâmetro dn especifica a entrada de diretório e atributo refere-se ao atributo a ser excluído.
get_operation_result()Retorna o código de resultado e mensagem para as operações ligar, procurar, incluir, modificar, renomear e excluir.
modify(args)Modifica os valores dos atributos para uma entrada de diretório específica. Usa os seguintes argumentos como um hash:
  • :dn — o DN da entrada de diretório a ser modificada.
  • :operations — as modificações, cada uma delas especificada como uma array composta pelos seguintes elementos:
    • Operador — pode ser :add, :replace ou :delete
    • Nome do atributo — o atributo a ser modificado
    • Valor do atributo — o valor do atributo
new(args = {})Cria um objeto do tipo Net::LDAP, mas não abre uma conexão com o servidor. Os argumentos possíveis são:
  • :host - host do servidor do LDAP; o padrão é localhost.
  • :port - a porta do servidor do LDAP; o padrão é 389.
  • :auth - um hash contendo os parâmetros de autorização.

Criando um aplicativo Rails

Nesta seção, você criará um aplicativo Rails para criar um serviço de diretório com a biblioteca Net::LDAP Ruby. Use o comando rails para criar um aplicativo denominado netldap:

c:/ruby>rails netldap

Um aplicativo Rails é criado apresentando uma estrutura de diretórios completa. Você executará o aplicativo Net::LDAP Ruby on Rails como um script de controlador, com as ações do controlador, com o objetivo de criar, modificar, procurar e excluir uma entrada de diretório. Criará também os modelos de visualização RHTML correspondentes a cada ação do controlador a fim de inserir dados para as entradas de diretório.

Crie um script de controlador denominado directory composto pelas ações de controlador add_entry, modify_entry, search_entry e delete_entry:

C:/ruby/netldap>ruby script/generate controller directory
add_entry modify_entry search_entry delete_entry

O script directory_controller.rb foi criado no diretório controllers. O script é composto pelas ações do controlador add_entry, modify_entry, search_entry e delete_entry: Os modelos de visualização add_entry.rhtml, modify_entry.rhtml, search_entry.rhtml, e delete_entry.rhtml são criados na pasta views.

Nas seções a seguir, você modificará as ações do controlador e os modelos de visualização a fim de incluir, modificar, procurar e excluir uma entrada de diretório.


Criando uma entrada de diretório

A próxima etapa é criar uma entrada de diretório no Tivoli Directory Server. Uma entrada de diretório é composta pelos atributos e seus valores. O DN de uma entrada de diretório representa seu nome distinto. Um DN é composto pelo nome distinto relativo e pelo DN base. Por exemplo, crie uma entrada de diretório no DN raiz/base cn=localhost.

Inicie a instância do Tivoli Directory Server caso ela não esteja ainda iniciada.

Cada entrada de diretório é identificada por um atributo dn. Os atributos objectClass especificam o tipo de dados e os atributos obrigatórios e opcionais em uma entrada. As classes de objeto formam uma hierarquia de classes; algumas das classes de objetos comumente usadas são top, organization e organizationalPerson. Todas as classes de objetos são subclasses da classe top. Você criará um serviço de diretório com as classes de objeto top, person e organizationalPerson:

  • top não tem nenhum atributo obrigatório.
  • person tem os atributos obrigatórios cn e sn.
  • organizationalPerson não tem nenhum atributo obrigatório. Alguns atributos que podem ser especificados em uma entrada de diretório da classe de objeto organizationalPerson são title e telephoneNumber.

Modifique o modelo de visualização add_entry.rhtml para inserir dados para a entrada de diretório. Defina um formulário com o método form_tag da classe FormTagHelper. Defina um campo no formulário com o método text_field((object_name, method, options = {}). O parâmetro object do método representa um objeto do modelo de formulário. O parâmetro method representa um campo do formulário como um atributo do objeto form. Por exemplo, o campo de texto a seguir:

text_field("directory_entry", "title", "size" => 20)

converte para HTML o campo de texto do formulário:

<input type="text" id="directory_entry_title" name="directory_entry[title]" size="20"
value="#{@directory_entry.title}" />

Inclui os campos de texto para nome, sobrenome, título, número de telefone, departamento e número de fax em add_entry.rhtml.

Campo de textoAtributo
Nome gn
Sobrenome sn
Título title
Número de telefone telephoneNumber
Departamento physicalDeliveryOfficeName
Número de FAX facsimileTelephoneNumber

A listagem 1 ilustra a add_entry.rhtml.

Listagem 1. add_entry.rhtml
<html>
<body>

<div>
    <table border='0' cellspacing='0' cellpadding='5'>
       <tr>
         <caption>
           Add Directory Entry
         </caption>
       </tr>
          <!-- start_form_tag -->
     <%= form_tag :action => "add_entry" %>
       <tr>
          <td>First Name*</td>
          <td><%= text_field(:add_entry, :gn) %></td>
       </tr><tr>
           <td>Last Name*</td>
           <td><%= text_field(:add_entry, :sn) %></td>
       </tr>

       <tr>
           <td>Title</td>
           <td><%= text_field(:add_entry, :title) %></td>
       </tr><tr>
           <td>Telephone Number</td>
           <td><%= text_field(:add_entry, :telephoneNumber) %></td>
       </tr>

       <tr>
           <td>Department</td>
           <td><%= text_field(:add_entry, :physicalDeliveryOfficeName) %></td>
       </tr>


       <tr>
            <td>Fax Number</td>
            <td><%= text_field(:add_entry, :facsimileTelephoneNumber) %></td>
       </tr>


       <tr>
            <td><input type="submit" value="Submit"></td>
       </tr>
     <%= end_form_tag %>
     </table>
        </div>
* indicates a required field.
</body>
</html>

Modifique a ação de controlador add_entry e recupere os valores dos parâmetros. Recupere o nome (:gn) e sobrenome (:sn), e defina uma variável cn.

values = params[:add_entry]
    gn=values[:gn]
    sn= values[:sn]
    cn=gn+sn

Defina o nome distinto da entrada de diretório, dn, composto pelo rdn e pelo DN base.

dn="cn="+cn+",cn=localhost"

Recupere valores de outros campos do formulário.

title=values[:title]
telephoneNumber=values[:telephoneNumber]
physicalDeliveryOfficeName=values[:physicalDeliveryOfficeName]
facsimileTelephoneNumber=values[:facsimileTelephoneNumber]

Defina uma variável, attr, composta por diferentes atributos da entrada de diretório.

attr = {
   :cn => cn,
   :objectclass => ['top', 'person', 'organizationalPerson'],
   :sn => sn,
   :title => title,
   :telephoneNumber => telephoneNumber,
   :physicalDeliveryOfficeName => physicalDeliveryOfficeName,
   :facsimileTelephoneNumber => facsimileTelephoneNumber
    }

Abra uma conexão ao Tivoli Directory Server e inclua a entrada de diretório para o servidor usando o método add().

Net::LDAP.open( :host => 'localhost', :port => 389,:base => 
'cn=localhost', :auth => { :method => :simple, :username => 'cn=root',
:password => 'tivoli' } ) do |ldap| ldap.add( :dn => dn, :attributes => attr ) end

Crie uma entrada de diretório com o modelo add_entry.rhtml. Inicie o servidor WEBrick com o seguinte comando:

C:/ruby/netldap>ruby script/server

Chame o modelo de visualização add_entry.rhtml com a URL http://localhost:3000/directory/add_entry.rhtml. Especifique os valores dos diferentes atributos e clique em Submeter, conforme mostrado a seguir.

Figura 1. Incluindo uma entrada de diretório
Adding a directory entry

Uma entrada é criada no diretório cn=localhost na instância do Tivoli Directory Server. Selecione a entrada de diretório cn=localhost, na Web Administration Tool, e clique em Expandir, como ilustrado abaixo.

Figura 2. Listando as entradas de diretório para cn=localhost
Listing the Directory Entries for cn=localhost

O diretório incluído usando o Ruby on Rails é listado nas entradas do diretório cn=localhost. Para listar os atributos da entrada de diretório, selecione a entrada e clique em Editar atributos.

Figura 3. Listando os atributos da entrada de diretório incluída
Listing the Attributes for the Directory Entry Added

Os atributos da entrada de diretório incluídos são exibidos.

Figura 4. Exibindo os atributos da entrada de diretório incluída
Displaying the Attributes for the directory entry

Modificando uma entrada de diretório

Nesta seção, você modificará uma entrada de diretório. Os dados a serem modificados são inseridos em modify_entry.rhtml. Assim como na inclusão da entrada, inclua um formulário no modelo de visualização modify_entry.rhtml com o método form_tag da classe FormTagHelper. Inclua os campos do formulário com o método text_field da classe FormHelper. A listagem 2 ilustra o modelo de visualização modify_entry.rhtml.

Listagem 2. modify_entry.rhtml
<html>
<body>

<div>
    <table border='0' cellspacing='0' cellpadding='5'>
       <tr>
         <caption>
             Modify Directory Entry
         </caption>
       </tr>
    <!-- start_form_tag -->
     <%= form_tag :action => "modify_entry" %>
       <tr>
            <td>First Name*</td>
            <td><%= text_field(:modify_entry, :gn) %></td>
       </tr><tr>
            <td>Last Name*</td>
            <td><%= text_field(:modify_entry, :sn) %></td>
       </tr>

       <tr>
            <td>Title</td>
            <td><%= text_field(:modify_entry, :title) %></td>
       </tr><tr>
            <td>Telephone Number</td>
            <td><%= text_field(:modify_entry, :telephoneNumber) %></td>
       </tr>

       <tr>
            <td>Department</td>
            <td><%= text_field(:modify_entry, :physicalDeliveryOfficeName) %></td>
       </tr>


       <tr>
            <td>Fax Number</td>
            <td><%= text_field(:modify_entry, :facsimileTelephoneNumber) %></td>
       </tr>


       <tr>
            <td><input type="submit" value="Submit"></td>
       </tr>
   <%= end_form_tag %>
  </table>
        </div>
* indicates a required field.
</body>
</html>

Quando o modelo modify_entry.rhtml for submetido, a ação modify_entry do controlador directory será chamada. Modifique a ação de controlador modify_entry.

Recupere os valores dos campos do formulário :gn e :sn, e defina uma variável cn.

values = params[:modify_entry]
    gn=values[:gn]
    sn= values[:sn]
    cn=gn+sn

Uma entrada de diretório é identificada com um nome distinto. Defina o DN da entrada de diretório a ser modificada.

dn="cn="+cn+",cn=localhost"

Recupere valores dos outros campos do formulário.

title=values[:title]
telephoneNumber=values[:telephoneNumber]
physicalDeliveryOfficeName=values[:physicalDeliveryOfficeName]
 facsimileTelephoneNumber=values[:facsimileTelephoneNumber]

Abra uma conexão com o Tivoli Directory Server e substitua os valores do atributo com o método replace_attribute. Por exemplo, o atributo :title é substituído como segue:

Net::LDAP.open( :host => 'localhost', :port => 389,:base => 
'cn=localhost', :auth => { :method => :simple, :username => 'cn=root',
:password => 'tivoli' } ) do |ldap| ldap.replace_attribute dn, :title, title end

Uma entrada de diretório é modificada a partir do modelo de visualização modify_entry.rhtml. Inicie o servidor da Web WEBrick e chame o modelo de visualização modify_entry.rhtml com a URL http://localhost:3000/directory/modify_entry.rhtml. Especifique a entrada de diretório a ser modificada e os atributos modificados. Clique em Submeter, como ilustrado a seguir.

Figura 5. Modificando uma entrada de diretório
Modifying a directory entry

A entrada de diretório é modificada como mostrada na Web Administration Tool.

Figura 6. Entrada de diretório modificada
Modified directory entry

Procurando um diretório

Esta seção aborda como procurar uma entrada de diretório. Você exibirá o resultado da procura de diretório na mesma página em que os dados da entrada foram inseridos, usando a técnica Ajax Web. A técnica Ajax Web é implementada pela biblioteca de protótipos. A biblioteca de protótipos inclui a classe PrototypeHelper para a criação de um formulário que possa ser atualizado assincronamente usando o Ajax. Inclua a biblioteca de protótipos no modelo de visualização search_entry.rhtml.

<%= javascript_include_tag "prototype" %>

Inclua um formulário submetido usando o Ajax com o método form_remote_tag da classe PrototypeHelper. A opção :update de form_remote_tag especifica o elemento do formulário a ser atualizado pela resposta do servidor. A opção :url especifica a URL à qual o formulário será submetido e o parâmetro :action especifica a ação de controlador.

<%=form_remote_tag(:update=>"directory_entry",
:url=>{:action=>:search_entry}) %>
<% end_form_tag %>

Especifique os campos de inserção da entrada de diretório usando text_field_tag da classe FormTagHelper. O elemento do formulário a ser atualizado será especificado como um div.

<div id="directory_entry"></div>

O modelo de visualização search_entry.rhtml é ilustrado na Listagem 3.

Listing 3. search_entry.rhtml
<html><head>
    <title></title>
    <%= javascript_include_tag "prototype" %>
  </head>

<body>
     <caption>
      Search  Directory Entry 
     </caption>
    <%=form_remote_tag(:update=>"directory_entry",
           :url=>{:action=>:search_entry}) %>
     <table>
           <tr>       
     <label>First Name*</label>
    <%=text_field_tag:firstName %></tr>
       <tr><label>Last Name</label>
    <%=text_field_tag:lastName %></tr>
      <%=submit_tag "Search" %>
    </table>
     <caption>
         <b> Directory Entry Table</b>
     </caption>

   <div id="directory_entry"></div>
   <% end_form_tag %>          
        * indicates a required field.
</body>

</html>

Quando o formulário search_entry.rhtml for submetido, a ação search_entry do controlador de diretório será chamada. Modifique a ação search_entry. Recupere os valores dos campos :gn e :sn e defina o DN base da entrada de diretório para procura.

gn=values[:gn]
 sn= values[:sn]
cn=gn+sn
treebase= "cn="+cn+",cn=localhost"

Especifique os atributos da entrada de diretório a ser recuperada.

attrs = ["cn", "sn","title", "telephoneNumber","physicalDeliveryOfficeName",
"facsimileTelephoneNumber"]

Abra uma conexão com o Tivoli Directory Server e procure pela entrada de diretório especificada usando o método search da classe Net::LDAP.

Net::LDAP.open( :host => 'localhost', :port => 389,:base => 
'cn=localhost', :auth => { :method => :simple, :username =>
'cn=root', 

:password =>'tivoli' } ) do |ldap| ldap.search( :base => treebase, :attributes => attrs, :return_result => true ) do |directory| end

O método search retorna um conjunto de resultados. Faça uma iteração sobre o conjunto de resultados e crie uma tabela HTML para enviar uma resposta ao modelo de visualização search_entry.rhtml. Por exemplo, uma linha para o atributo cn é adicionada à tabela.

directoryEntry+="<tr>"
directoryEntry+="<td>cn</td>"
directoryEntry+="<td>"+"#{directory.cn}"+"</td>"
directoryEntry+="</tr>"

Chame o modelo de visualização search_entry.rhtml com a URL http://localhost:3000/directory/search_entry.rhtml para procurar uma entrada de diretório. Especifique os atributos :gn e :sn, que formam o rdn de uma entrada de diretório,e clique em Procurar.

Figura 7. Procurando uma entrada de diretório
Searching for a directory entry

Os atributos da entrada de diretório são listados.

Figura 8. Resultado da procura da entrada de diretório
Directory entry search result

Excluindo uma entrada de diretório

Nesta seção, você excluirá uma entrada de diretório. Uma entrada de diretório é identificada por um DN, composto pelo rdn e pelo DN base. O RDN da entrada de diretório a ser modificada é especificado no modelo de visualização delete_entry.rhtml. O método form_tag é usado para criar um formulário e a tag text_field, para criar um campo de texto no formulário. O modelo de visualização delete_entry.rhtml, composto pelos campos de entrada para nome e sobrenome, são ilustrados a seguir.

Listagem 4. delete_entry.rhtml
<html>
<body>

<div>
                <table border='0' cellspacing='0' cellpadding='5'>
                        <tr>
                                <caption>
                                        Delete Entry
                                </caption>
                        </tr>
                        <!-- start_form_tag -->
                        <%= form_tag :action => "delete_entry" %>
                        <tr>
                                <td>First Name*</td>
                                <td><%= text_field(:delete_entry, :gn) %></td>
                        </tr><tr>
                                <td>Last Name*</td>
                                <td><%= text_field(:delete_entry, :sn) %></td>
                        </tr><tr>
                                <td><input type="submit" value="Submit"></td>
                        </tr>
                        <%= end_form_tag %>
                </table>
        </div>
* indicates a required field.
</body>
</html>

Quando o formulário delete_entry.rhtml for submetido, a ação delete_entry do controlador directory será chamada. A ação de controlador delete_entry recupera os valores dos campos do formulário e cria um DN da entrada de diretório a ser excluída.

values = params[:delete_entry]
    gn=values[:gn]
    sn= values[:sn]
    cn=gn+sn
    dn="cn="+cn+",cn=localhost"

Abra uma conexão com o servidor de diretório e exclua a entrada usando o método delete da classe Net::LDAP.

Net::LDAP.open( :host => 'localhost', :port => 389,
:base => 'cn=localhost', :auth => { :method => :simple, :username => 
'cn=root', :password => 'tivoli' } ) do |ldap|
     ldap.delete :dn => dn
 end

Para excluir uma entrada de diretório, chame o modelo de visualização delete_entry.rhtml usando a URL http://localhost:3000/directory/delete_entry.rhtml. Especifique os atributos :gn (nome) e :sn (sobrenome) da entrada de diretório a ser excluída e clique em Submeter.

Figura 9. Excluindo uma entrada de diretório
Deleting a directory entry

A entrada de diretório é excluída como mostrada na Web Administration Tool.

Figura 10. Web Administration Tool com a entrada de diretório excluída
Web Administration Tool with the deleted directory entry

O script do controlador directory_controller.rb é ilustrado a seguir.

Listagem 5. directory_controller.rb
require 'net/ldap'

class DirectoryController < ApplicationController

def add_entry

    values = params[:add_entry]
    gn=values[:gn]
    sn= values[:sn]
    cn=gn+sn

     dn="cn="+cn+",cn=localhost"
    
     title=values[:title]
     telephoneNumber=values[:telephoneNumber]
     physicalDeliveryOfficeName=values[:physicalDeliveryOfficeName]
     facsimileTelephoneNumber=values[:facsimileTelephoneNumber]

     attr = {
   :cn => cn,
   :objectclass => ['top', 'person', 'organizationalPerson'],
   :sn => sn,
   :title => title,
   :telephoneNumber => telephoneNumber,
   :physicalDeliveryOfficeName => physicalDeliveryOfficeName,
   :facsimileTelephoneNumber => facsimileTelephoneNumber
    }



Net::LDAP.open( :host => 'localhost', :port => 389,:base =>
'cn=localhost', :auth => { :method => :simple, :username => 'cn=root', 

:password => 'tivoli' } ) do |ldap| ldap.add( :dn => dn, :attributes => attr ) end end def delete_entry values = params[:delete_entry] gn=values[:gn] sn= values[:sn] cn=gn+sn dn="cn="+cn+",cn=localhost" Net::LDAP.open( :host => 'localhost', :port => 389,:base => 'cn=localhost', :auth => { :method => :simple, :username => 'cn=root',
:password => 'tivoli' } ) do |ldap| ldap.delete :dn => dn end end def search_entry gn=params[:firstName] sn= params[:lastName] cn=gn+sn treebase= "cn="+cn+",cn=localhost" attrs = ["cn", "sn","title", "telephoneNumber","physicalDeliveryOfficeName", "facsimileTelephoneNumber"] directoryEntry="<table border><tr><th>Attribute</th> ;<th>Value</th></tr>" Net::LDAP.open( :host => 'localhost', :port => 389,:base => 'cn=localhost', :auth => { :method => :simple, :username => 'cn=root',
:password => 'tivoli' } ) do |ldap| ldap.search( :base => treebase, :attributes => attrs, :return_result => true ) do |directory| directoryEntry+="<tr>" directoryEntry+="<td>cn</td>" directoryEntry+="<td>"+"#{directory.cn}"+"</td>" directoryEntry+="</tr>" directoryEntry+="<tr>" directoryEntry+="<td>sn</td>" directoryEntry+="<td>"+"#{directory.sn}"+"</td>" directoryEntry+="</tr>" directoryEntry+="<tr>" directoryEntry+="<td>title</td>" directoryEntry+="<td>"+"#{directory.title}"+"</td>" directoryEntry+="</tr>" directoryEntry+="<tr>" directoryEntry+="<td>telephoneNumber</td>" directoryEntry+="<td>"+"#{directory.telephoneNumber}"+"</td>" directoryEntry+="</tr>" directoryEntry+="<tr>" directoryEntry+="<td>physicalDeliveryOfficeName</td>" directoryEntry+="<td>"+"#{directory.physicalDeliveryOfficeName}"+"</td>" directoryEntry+="</tr>" directoryEntry+="<tr>" directoryEntry+="<td>facsimileTelephoneNumber</td>" directoryEntry+="<td>"+"#{directory.facsimileTelephoneNumber}"+"</td>" directoryEntry+="</tr>" end directoryEntry+="</table>" render:text=> directoryEntry end end def modify_entry values = params[:modify_entry] gn=values[:gn] sn= values[:sn] cn=gn+sn dn="cn="+cn+",cn=localhost" title=values[:title] telephoneNumber=values[:telephoneNumber] physicalDeliveryOfficeName=values[:physicalDeliveryOfficeName] facsimileTelephoneNumber=values[:facsimileTelephoneNumber] Net::LDAP.open( :host => 'localhost', :port => 389,:base => 'cn=localhost', :auth => { :method => :simple, :username => 'cn=root',
:password => 'tivoli' } ) do |ldap| ldap.replace_attribute dn, :title, title ldap.replace_attribute dn, :telephoneNumber, telephoneNumber ldap.replace_attribute dn, :physicalDeliveryOfficeName, physicalDeliveryOfficeName ldap.replace_attribute dn, :facsimileTelephoneNumber, facsimileTelephoneNumber end end end

Resumo

Neste artigo, você instalou o Ruby on Rails e a Net::LDAP Ruby gem. Aprendeu a criar uma entrada de diretório no Tivoli Directory Server V6.0 e a modificar, procurar e excluí-la, com a linguagem de script Ruby.

O Ruby é comparável ao PHP, a linguagem de script mais comumente usada, na sua aplicação no desenvolvimento de serviços de diretório LDAP. De acordo com o TIOBE Programming Community Index, a utilização do Ruby cresceu no último ano.


Download

DescriçãoNomeTamanho
LDAP applicationos-ldap-tivoli-ruby_ldap-app.zip29KB

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre, Tivoli
ArticleID=396016
ArticleTitle=Use o Ruby on Rails para criar um serviço de diretório LDAP no Tivoli Directory Server V6.0
publish-date=04282009