UM WEB SERVICE EM JAVA PARA AUTENTICAÇÃO UTILIZANDO

Propaganda
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.
Download