Revista Eletrônica da Faculdade Metodista Granbery http://re.granbery.edu.br - ISSN 1981 0377 Curso de Sistemas de Informação - N. 17, JUL/DEZ 2014 UM WEB SERVICE EM JAVA PARA AUTENTICAÇÃO UTILIZANDO PROTOCOLO LDAP. Gabriel Sobreira de Moraes 1 Flávio Alexandre dos Reis 2 RESUMO O objetivo desde trabalho é apresentar, de forma simples, um Web Service em Java que permita a centralização da autenticação de sistemas em um ambiente corporativo. Comumente a autenticação, é realizada através da criação de usuários específicos em cada um dos mesmos, o que torna de difícil controle o gerencia no acesso dos usuários. Inicialmente será apresentada uma rápida abordagem sobre as linguagens de programação Java e PHP, conceitos de um Web Service e também sobre o Serviço de Diretório LDAP. Ao final, é apresentado um estudo de caso com a implementação de um Web Service em Java para prover o serviço de autenticação de usuários, um cliente também desenvolvido em Java e um cliente desenvolvido em PHP, ambos consumindo o serviço de autenticação disponibilizado pelo Web Service. Com esse estudo de caso, este artigo mostrará o conceito e a aplicação da autenticação centralizada, ou seja, sistemas distintos, desenvolvidos em diferentes linguagens, utilizarão apenas uma base de dados de usuário para autorizar o acesso a um determinado sistema. Este artigo é recomendado para programadores com nível intermediário de conhecimento nas tecnologias Java e PHP, assume-se que o leitor saiba trabalhar com projetos web Java utilizando a ferramenta Eclipse. Palavras chave: JAVA, PHP, WEBSERVICE, LDAP, AUTENTICAÇÃO 1 Bacharel em Sistemas de Informação – FMG/JF Analista de Sistemas – FMG/JF Professor Curso Técnico em Informática: Banco de Dados e Programação Web. [email protected] 2 Especialista em Segurança da Informação – FMG/JF, Pós Graduando em Redes de Computadores – CES/JF. Certificado LPIC-1, CLA. Professor de Redes de Computadores, Sistemas Operacionais e Segurança da Informação. [email protected] www.reisfa.eti.br ABSTRACT The objective of this paper is to present, simply, a web service in Java that allows centralized authentication systems in an enterprise environment. Commonly authentication is performed by creating specific users in each of them making it difficult to control manages it in user access. Initially it presents a fast approach on Java and PHP programming languages, concepts of a Web Service and also on the LDAP Directory Service. Finally, a case study is presented with the implementation of a Web Service in Java to provide the authentication service users, a customer also developed in Java and a client developed in PHP, consuming both the authentication service provided by Web Service . In this case study, this article will show the concept and the implementation of centralized authentication, which are separate systems, developed in different languages, use only a user database to authorize access to a given system. This article is recommended for programmers with intermediate knowledge in Java and PHP technologies, it is assumed that the reader knows how to work with Java web projects using the Eclipse tool. Key Words: JAVA, PHP, WEBSERVICE, LDAP, AUTHENTICATION INTRODUÇÃO Para possibilitar a interoperabilidade entre sistemas utilizando autenticação centralizada, serão utilizadas as seguintes ferramentas: Diretório LDAP, que é um repositório de dados em forma de árvore, cada nó representará um usuário com seus atributos; Web Service que é uma aplicação web responsável por disponibilizar o serviço de acesso ao diretório LDAP para ser consumido por clientes, que pode ser desenvolvido em diversas plataformas e linguagens de desenvolvimento de aplicações. No artigo será abordado de forma mais detalhada o; Java, uma linguagem de programação amplamente utilizada pela comunidade de desenvolvedores que proporciona a criação do Web Service de forma simples e objetiva. Ao integrar as funcionalidades de cada ferramenta descrita anteriormente, será possível disponibilizar o serviço de autenticação centralizada, evitando redundâncias de dados e manutenção de Software. Esse trabalho está dividido da seguinte forma: Além dessa Introdução, será apresentada uma abordagem teórica sobre as linguagens de programação JAVA e PHP, que serão utilizadas no estudo de caso, será apresentado o Web Service e sua importância para o estudo proposto, conceitos do diretório LDAP, será criado o Web Service de autenticação centralizada, proposto neste estudo, será criado um cliente Java e um PHP para consumir o Web Service e por fim as considerações Finais e trabalhos futuros. Linguagens utilizadas Nesse tópico será apresentado as ferramentas utilizadas para construção do projeto, mostrando algumas de suas funcionalidades assim como vantagens de uso das mesmas. Java Em 1991 o Java começou a surgir na Sun Microsystems, inicialmente projetado para facilitar a convergência entre um computador e equipamentos eletrônicos como os eletrodomésticos por exemplo. Depois acabou sendo adaptado para a internet e uma das grandes diferenças da linguagem de programação Java para as demais é que qualquer hardware ou equipamento eletrônico que possa executar uma máquina virtual conseguirá executar o Java, ou seja, o código do programa é escrito apenas uma vez e pode ser executado em qualquer equipamento eletrônico (LUCKOW, 2010). Neste artigo, o Java foi escolhido para ser a linguagem de programação a ser utilizada na codificação e desenvolvimento do Web Service de autenticação centralizada, pois, além do seu diferencial que permite-o ser executado em qualquer plataforma, é a linguagem base do curso de pós graduação em desenvolvimento web da Universidade Federal de Juiz de Fora. Caracteristicas do java As principais características de Java são as seguintes: Concisa e simples: não contém redundâncias e é fácil de entender, implementar e usar. Parecida com C++ para facilitar compreensão por grande parte de programadores. É uma evolução de C++: não suporta aritmética de ponteiros, registros, etc. Orientada a objetos: suporta os principais conceitos de orientação a objetos. Favorece extensibilidade e reusabilidade. Provê acesso a Internet/WWW: Contém bibliotecas especiais que possibilitam o trabalho com protocolos TCP/IP como HTTP e FTP. Permite acesso a URLs. Robusta: fortemente tipada. Programas são confiáveis. Reduz imprevistos em tempo de execução: variáveis são automaticamente inicializadas, uso disciplinado de ponteiros, rotinas devem ser chamadas corretamente, etc. Portável: aplicações funcionam do mesmo jeito em qualquer ambiente. Completamente especificada. Não contém aspectos dependentes da implementação: o tamanho dos tipos é fixo para qualquer projeto, etc. Segura: restrições de acesso a arquivos (applets), manipulação de ponteiros, etc. Implica que não é útil para desenvolver certas aplicações como `device drivers', etc. Concorrente: suporta aplicações concorrentes: multithreads e monitores. Por outro lado as principais características da implementação atual de Java são as seguintes: Independente de plataforma: código gerado pelo compilador funciona em qualquer ambiente. Geração de bytecode que pode ser interpretado para qualquer arquitetura e sistema operacional tendo o sistema Java. Facilita distribuição de software. Interpretada: facilita desenvolvimento exploratório. Perde em eficiência. Compilada: utilizando compiladores, bytecodes podem ser traduzidos em tempo de execução para código de máquina. PHP PHP (um acrônimo recursivo para "PHP: Hypertext Preprocessor", originalmente Personal Home Page) é uma linguagem interpretada, livre, usada originalmente apenas para o desenvolvimento de aplicações presentes e atuantes no lado do servidor e capazes de gerar conteúdo dinâmico na World Wide Web. O código é interpretado no lado do servidor pelo módulo PHP, que também gera a página web a ser visualizada no lado do cliente. A linguagem evoluiu, passou a oferecer funcionalidades em linha de comando, e além disso, ganhou características adicionais, que possibilitaram usos adicionais do PHP, não relacionados a web sites. É possível instalar o PHP na maioria dos sistemas operacionais, gratuitamente. Concorrente direto da tecnologia ASP pertencente à Microsoft, o PHP é utilizado em aplicações como o MediaWiki, Facebook, Drupal, Joomla, WordPress, Magento e o Oscommerce. Criado por Rasmus Lerdorf em 1995, o PHP tem a produção de sua implementação principal — referência formal da linguagem, mantida por uma organização chamada The PHP Group. O PHP é software livre, licenciado sob a PHP License, uma licença incompatível com a GNU General Public License (GPL) devido a restrições no uso do termo PHP. O PHP foi selecionado a ser uma linguagem de programação que utiliza a codificação para o desenvolvimento do cliente que consumirá o serviço de autenticação do Web Service, a escolha de linguagens diferentes para o servidor e o cliente é justamente o foco deste estudo, ou seja, aplicações distintas, desenvolvidas em linguagens de diferentes paradigmas, utilizarão o mesmo serviço para realizar a autenticação de seus usuários. Principais características editar A linguagem PHP é uma linguagem de programação de domínio específico, ou seja, seu escopo se estende a um campo de atuação que é o desenvolvimento web, embora tenha variantes como o PHP-GTK. Seu propósito principal é de implementar soluções web velozes, simples e eficientes. A seguir umas de suas principais características: ● Velocidade23 24 25 e robustez26 27 . ● Estruturado e orientação a objetos. ● Portabilidade - independência de plataforma - escreva uma vez, rode em qualquer lugar. ● Tipagem dinâmica. ● Sintaxe similar a C/C++ e o Perl. ● Open-source. ● Server-side (O cliente manda o pedido e o servidor responde em página HTML)(PHP 2015) WEB SERVICE Atualmente existem várias plataformas de desenvolvimento de Software e, além disso, os mais modernos não são criados para serem executados isoladamente, pelo contrario, um bom sistema deve interoperar com outros, que podem ser escritos em diferentes linguagens. Com isso, o Web Wervice que é neutro de linguagem é uma ótima opção para fazer a interoperabilidade entre sistemas desenvolvidos em diferentes plataformas de desenvolvimento de Software. O Web Service é uma aplicação web oferecida através de HTTP (Hyper Text Transport Protocol), que pode ser aplicada ou executada em diferentes tipos de dispositivos, portanto é uma aplicação distribuída, que poderá ser consumida por clientes que precisam do resultado que é retornado por ele (KALIN, 2010). Ainda segundo Newcomer (2002), um serviço web tem um nível de abstração acima de qualquer software existente, tais como servidores de aplicação, .NET, Java, PHP, dentro outros. O Web Service trabalha em um nível de abstração semelhante ao da Internet e é capaz de superar qualquer sistema operacional, plataforma de hardware ou linguagem de programação. Os serviços são disponibilizados e aplicações distintas conseguem acessar estes recursos enviando e recebendo dados em formato XML (Extensible Markup Language). O XML surgiu do SGML (Standard Generalized Markup Language), e uma de suas características é a separação de formato e conteúdo, ou seja, o formato é descrito de forma independente do conteúdo, portanto, o conteúdo de um documento poderia sair em vários formatos sem alterá-lo. Este princípio característico das linguagens de marcação é aplicado ao Web Service através da separação dos esquema, que descreve as estruturas e tipos de dados, incluindo informação semântica útil mapeando o documento para várias linguagens de programação (NEWCOMER, 2002). DIRETÓRIO LDAP O diretório é um serviço de armazenamento hierárquico de informações e utilizado como local de armazenamento de informações relativas aos usuários de uma rede corporativa. Segundo Trigo (2007), administrar uma rede com diversos servidores pode ser complicado; por exemplo, para manter as informações de autenticação de cada um deles sincronizada, quando um novo usuário é criado na rede, é preciso configurar as regras de acessos deste novo cliente em cada servidor e, a situação é a mesma, quando um outro é desligado; é necessário excluir as regras em cada servidor para que ele não tenha mais acesso; isso é questão de segurança. Portanto, podemos definir que diretório é árvore de nós e cada nó consisti de vários atributos e seus valores, é uma base de dados otimizada para busca de informações e é usado para indicar direções, ou seja, através do diretório é obtido o caminho para chegar ao que se procura e este caminho pode ser referenciado com nomes, ao invés de endereços lógicos. Sua função principal é facilitar a recuperação dessas informações armazenadas. (MORAES, 2009). O LDAP foi criado devido à grande necessidade de integração das informações que aplicações distintas utilizam para realizar suas operações. É um protocolo que define um método para acesso e atualização de dados em um diretório. É um protocolo para pesquisar e atualizar diretórios. (SUNGAILA, 2007). CRIANDO O WEB SERVICE Neste capítulo serão apresentados os passos utilizados para criar o Web Service conforme estudado. Será utilizada a ferramenta Eclipse na versão Kepler para a programação e o JBoss 7 como servidor web, ambos devem estar configurados e prontos para rodar um projeto web. Não é o objetivo mostrar a configuração de cada servidor aqui utilizado, portando, não será apresentado detalhes sobre a configuração dos mesmos. Nesse ambiente fora utilizado três sistemas operacionais diferentes, um Debian GNU/Linux contendo a JBoss 7, um Windows server 2012 com Active Directory e um Windows 8 para servir como máquina de desenvolvimento e testes. A configuração de cada um desses ativos irá interferir no desempenho, dependendo do número de acessos simultâneos. No ambiente atual o Windows Server 2012 e o Debian foram virtualizados, disponibilizando os recursos mínimos para seu uso. A seguir é apresentado um exemplo de criação e usabilidade de um WebService utilizando o Eclipse. Observe nas Figuras 1 e Figura 2 os passos necessários para que seja criado um novo projeto. . Figura 1: Criando um novo projeto web no Eclipse. Figura 2: Criando um novo projeto web no Eclipse. Após a criação do projeto, é criada a classe br.edu.exemplowebservice.model, conforme mostrado na Figura 3. UsuarioAD no pacote Figura 3: Criando a classe UsuarioAD. A classe UsuarioAD terá os atributos cn (common names)(common name), displayName e mail do tipo String e os métodos get e set para cada atributo, conforme apresentado na Figura 4. package br.edu.exemplowebservice.model; public class UsuarioAD { private String cn; private String displayName; private String mail; public String getCn() { return cn; } public void setCn(String cn) { this.cn = cn; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } } Tabela 1: Atributos e métodos da classe UsuarioAD. A classe UsuarioAdDAO é criada no pacote br.edu.exemplowebservice.dao e será responsável por acessar o diretório LDAP e validar a autenticação, a figura 5 mostra sua criação. Figura 5: Criando a classe UsuarioAdDAO . Na classe UsuarioAdDAO é criado o método authenticate que recebe como parâmetros o usuário e senha do usuário e verifica no diretório LDAP se os dados estão corretos, retornando um objeto do tipo UsuarioAD, conforme figura 6. package br.edu.exemplowebservice.dao; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; import br.edu.exemplowebservice.model.UsuarioAD; public class UsuarioAdDAO { private static UsuarioAdDAO INSTANCE; private UsuarioAdDAO() { } public static UsuarioAdDAO getInstance() { if (INSTANCE == null) { INSTANCE = new UsuarioAdDAO(); }else{ return INSTANCE; } public UsuarioAD authenticate(String user, String pass) { ClassLoader prevCl = Thread.currentThread().getContextClassLoader(); ClassLoader classcl = this.getClass().getClassLoader(); Thread.currentThread().setContextClassLoader(classcl); String returnedAtts[] = { "cn", "displayName","mail" }; String searchFilter = "(&(objectClass=user)(sAMAccountName=" + user + "))"; String ip = "Informe o ip do servidor AD"; String dominio = "Informe o dominio do servidor AD"; String sintaxe = "Informe a sintaxe de busca AD"; SearchControls searchCtls = new SearchControls(); searchCtls.setReturningAttributes(returnedAtts); searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL,ip+":389"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, user + dominio); env.put(Context.SECURITY_CREDENTIALS, pass); LdapContext ctxGC = null; try { ctxGC = new InitialLdapContext(env, null); NamingEnumeration answer = ctxGC.search(sintaxe,searchFilter, searchCtls); while (answer.hasMoreElements()) { SearchResult sr = (SearchResult) answer.next(); Attributes attrs = sr.getAttributes(); UsuarioAD usuario = null; if (attrs != null) { usuario = new UsuarioAD(); NamingEnumeration ne = attrs.getAll(); while (ne.hasMore()) { Attribute attr = (Attribute) ne.next(); if (attr.getID().equals("cn")) { usuario.setCn(attr.get().toString()); } if (attr.getID().equals("displayName")) { usuario.setDisplayName(attr.get().toString()); } if (attr.getID().equals("mail")) { usuario.setMail(attr.get().toString());} } ne.close(); } return usuario; } } catch (NamingException ex) { ex.printStackTrace(); } return null; } } Tabela 2: Métodos da classe UsuarioAdDAO . Por fim, é criada a classe AutenticacaoWS no pacote br.edu.exemplowebservice.web, que será classe de representação do Web Service, ela será responsável por disponibilizar o serviço de autenticação para que qualquer cliente possa utilizar, conforme apresentado na Figura 7. Figura 7: Criação da classe AutenticacaoWS. Para definir a classe criada como uma Web Service, é utilizada a anotação @WebService e a anotação @SOAPBinding (style = Style.rpc) para definir o tipo do Web Service. O método autentica será responsável por receber as informações do usuário, retornar um objeto do tipo UsuarioAD com valores válidos caso a autenticação seja válida e um objeto nulo caso contrário, conforme figura 8. package br.edu.exemplowebservice.web; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; import br.edu.exemplowebservice.dao.UsuarioAdDAO; import br.edu.exemplowebservice.model.UsuarioAD; @WebService @SOAPBinding(style = Style.RPC) public class AutenticacaoWS { @WebMethod public UsuarioAD autentica(@WebParam(name = "login") String login, @WebParam(name = "senha") String senha) { UsuarioAdDAO usuarioDAO = UsuarioAdDAO.getInstance(); UsuarioAD usu = new UsuarioAD(); usu = usuarioDAO.authenticate(login, senha); return usu; } } Tabela 1: Criação da classe AutenticacaoWS. CRIANDO UM CLIENTE JAVA Nesta seção é criado um cliente JAVA para consumir o serviço disponibilizado pelo Web Service. package br.edu.cliente.webservice; import java.net.URL; public class Teste { public static void main(String[] args) { try { AutenticacaoWSServiceLocator service = new AutenticacaoWSServiceLocator(); AutenticacaoWS autenticacaoWS = service .getAutenticacaoWSPort(new URL( "http://localhost:8080/ExemploWebService/AutenticacaoWS?wsdl")); String login = "teste"; String senha = "xxxxxxxx"; UsuarioAD usu = new UsuarioAD(); usu = autenticacaoWS.autentica(login, senha); System.out.println("Autenticado: " + usu.getDisplayName()); } catch (Exception e) { System.out.println("Erro: " + e.getMessage()); } } } CRIANDO UM CLIENTE PHP Nesta seção é criado um cliente PHP para consumir o serviço disponibilizado pelo Web Service. Primeiro é criado um formulário html simples, apenas com os campos usuário e senha, conforme mostrado na figura 8. Figura 8: Formulário Html para autenticação. <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Teste do Web Service Autenticação</title> </head> <body> <center> <h1>Teste do Web Service Autenticação</h1> <form method="post" action="resultado.php"> Informe o login: <input type="text" name="login"/><br /> Informe a senha: <input type="password" name="senha"/><br /> <input type="submit" value="Enviar" /> </form> </center> </body> </html> O action do form envia dos dados para o arquivo resultado.php, mostrado a seguir, que faz a comunicação com o webservice por meio da classe SoapClient, chama o método autentica passando como parâmetro o usuário e a senha informada, recebe um retorno do webservice para validar a autenticação. <?php try{ $cliente = @new SoapClient ("http://localhost:8080/ExemploWebService/AutenticacaoWS?wsdl", array('trace' => 1)); } catch (Exception $e){ echo $e->getMessage(); } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>teste</title> </head> <body> <center> <h1>Resultado da Autenticação</h1> <?php $xml = $cliente->autentica($_POST['login'],$_POST['senha']);?> <?php if($xml->cn) { ?> Login: <?php echo( $xml->cn); ?> <br /> Codigo Academico: <?php echo( $xml->codAcademico); ?> <br /> Codigo Docente: <?php echo( $xml->codDocente) ;?> <br /> Codigo Funcional: <?php echo( $xml->codFuncional) ;?> <br /> Codigo Logos: <?php echo( $xml->codLogos) ;?> <br /> Nome: <?php echo( $xml->displayName) ;?> <br /> Apelido: <?php echo( $xml->givenName) ;?> <br /> E-mail: <?php echo( $xml->mail); ?> <br /> <?php }else{ echo 'Dados inválidos'; } ?> <br /> <a href="index.php"> Voltar </a> </center> </body> </html> Figura 9: Resultado após a autenticação. CONSIDERAÇÕES FINAIS Diante das duas tecnologias populares e de grande potencial (php e java), como demonstrado ao decorrer desse artigo. Todo cuidado deve ser tomado ao apontar qual delas é superior. É normal seguir o modismo e as tendências da época sem ter um prévio conhecimento que justifique a escolha de alguma. O intuito desse trabalho foi demonstrar as vantagens e facilidades adquiridas ao utilizar o Web Service, apresentando as ferramentas, englobando suas funcionalidades e conceitos. Já o SOAP é um padrão que, combinado com as especificações do Web Service, pode garantir questões de QoS (Quality of Service), segurança, transações e outras questões encontradas em integrações de maior complexidade, uma vez que seus protocolos são bem especificados. Finalizando o trabalho, pode-se definir que nem sempre a melhor tecnologia empregada dentro de um contexto será a melhor opção para qualquer outro, devendo sempre obter o conhecimento do cenário para que se possa utilizar a ciência que mais for adequada. REFERÊNCIAS KALIN, Martin. Java Web Services: Implementando. 1.ed. Rio de Janeiro: Alta Books, 2010. 293 p. LUCKOW, Décio Heinzelmann; MELO, Alexandre Altair. Programação Java para a Web: Aprender a desenvolver uma aplicação financeira pessoal com as ferramentas mais modernas da plataforma Java. São Paulo: Novatec, 2010. 638 p. MORAES, Gabriel Sobreira. Integração de Bases de Autenticação Baseada em Serviço de Diretório LDAP. Monografia de Graduação, Faculdade Metodista Granbery, Juiz de Fora, Brasil, 2009. SUNGAILA, M. Autenticação Centralizada com OpenLDAP. São Paulo: Novatec, 2007. TRIGO, C. H. OpenLDAP: uma abordagem integrada. São Paulo: Novatec, 2007. NEWCOMER, Eric. Understanding Web Services: XML, WSDL, SOAP, and UDDI. Boston: Addison Wesley, 2002.