Jos� Carlos Rocha,
Sou nova na lista e no java mas achei este material um dia desses, v�
se te serve.
Soraia
ps. do site
http://www.uol.com.br/webworld/tecnologia/handerson/hander6/hander006.htm
Implementando passo a passo a applet Password
Este artigo tenta mostrar todas as etapas de desenvolvimento de uma
applet simples e bastante �til. A maioria dos m�todos e eventos utilizados
neste artigo foram discutidos ou apresentados em uma das "dicas do dia". O
ponto inicial � apresentar o problema, com suas caracter�sticas e
limita��es. Em seguida vamos poder discutir a solu��o apresentada e os
recursos mais importantes utilizados no c�digo.
Handerson Ferreira Gomes
Defini��o do problema:
Muitos usu�rios utilizam espa�o em servidores espalhados pela Internet
(como o Geocities, XOOM, Freespace etc.) para publicar suas p�ginas. Al�m
destes, a maioria dos provedores oferecem um espa�o para hospedagem de uma
p�gina de seus usu�rios. Grande parte deste provedores, e principalmente as
empresas que oferecem espa�o gratuito, n�o oferecem servi�os personalizados
para o usu�rio, como por exemplo a implementa��o de seguran�a.
A proposta � construir uma aplica��o que fa�a a autentica��o de todos
usu�rios que acessem algumas p�ginas. Esta solu��o deve ser multiplataforma,
ocupar pouco espa�o em disco, ser de simples manute��o e de f�cil
manipula��o.
A solu��o proposta:
Implementar uma applet Java que fa�a a identifica��o do usu�rio. Em
uma p�gina principal o usu�rio se identifica e nas p�ginas subseq�entes uma
outra applet faz a autentica��o do usu�rio. Caso ele n�o tenha permiss�o
para acessar, o usu�rio ser� redirecionado para outra p�gina.
--------------------------------------------------------------------------
Muito bem, a solu��o foi proposta e agora � necess�rio modelar as
classes que far�o parte deste aplicativo. Como todo sistema de autentica��o
pela Internet, ser� usado Login e Senha para fazer a autentica��o do
usu�rio. Estes dados precisam ser registrados em algum local e estarem
dispon�veis para que a segunda applet possa acess�-los e fazer a valida��o
do login em cada p�gina. Como fazer isto???
Uma das solu��es pode ser armazenar os dados de login e senha num
arquivo tempor�rio, mas com isso a performance da applet pode ficar
seriamente comprometida. Uma boa solu��o � armazenar os dados de entrada
numa classe que tenha seus dados vis�veis por outras classes. Estes tipos de
dados s�o chamados de Static. M�todos e objetos podem ser definidos como
Static, o que faz destes m�todos e objetos acess�veis por qualquer outra
classe que esteja na m�moria cache do seu browser e no mesmo diret�rio. Esta
solu��o � boa e segura, pois os dados est�o armazenados na mem�ria do micro
cliente e os dados que est�o armazenados se referem a apenas este usu�rio,
isto �, sua senha e login.
No servidor teremos um arquivo texto contendo os dados dos usu�rios
(Login,Senha e Nome) que podem acessar as p�ginas de seu site. A estrutura
deste arquivo � a seguinte:
login:::senha:::nome do usuario
login:::senha:::nome do usuario
O problema parece estar resolvido. Ent�o vamos ver como ficou a
primeira tela.
Duas observa��es podem ser feitas neste ponto. A primeira � sobre a
seguran�a deste dados. Se de alguma forma o usu�rio conseguir decompilar sua
classe, ele ter� o nome do arquivo que armazena os dados do usu�rio. Uma
forma de dificultar � utilizar um arquivo texto criptografado. Mas veja bem,
se ele conseguiu decompilar sua classe, isto quer dizer que ele poder�
descriptograr os dados e ver as informa��es. Mas � praticamente imposs�vel
existir um sistema completamente seguro, pelo menos por muito tempo.
Vamos ter primeiro que criar a applet respons�vel pelo registro do
usu�rio. Os dados necess�rios s�o Login e Senha, como numa aplica��o
qualquer. Estes dados conforme especificado anteriormente estar�o
armazenados numa classe Static. Veja abaixo o c�digo fonte desta classe:
Programa��o
Coluna
a.. Esperando pelo HotSpot o novo compilador din�mico da SUN
b.. Java - Produtos & API's
c.. Customiza��o � base para a cria��o de aplica��es de n�vel
mundial
d.. Aumentando a performance de suas Applets
e.. Comprimindo sua Applet: conhe�a o comando padr�o para criar
um arquivo JAR
f.. Melhorando a performance de suas applets - parte II
--------------------------------------------------------------------------
Handerson Ferreira Gomes � Bacharel em Ci�ncia da Computa��o e
Tecn�logo em Processamento de Dados pela Universidade de Alfenas,
desenvolvedor Java no Centro Internacional de Tecnologia de Software, um dos
produtores do site ClubeJava-BR e membro da comiss�o de estudos e
padroniza��o da Linguagem Java do Subcomit� de Software da ABNT.
--------------------------------------------------------------------------
public class identificacao
static String Login = new String();
static String Senha = new String();
static String Nome = new String();
public identificacao(String _login, String _senha, String
_nome)
Login = _login;
Senha = _senha;
Nome = _nome;
}
public identificacao(String _login, String _senha)
Login = _login;
Senha = _senha;
Nome = "";
}
public identificacao()
Login= "";
Senha= "";
Nome = "";
}
static String getLogin()
return Login;
}
static String getSenha()
return Senha;
}
static String getNome()
return Nome;
}
static void setLogin(String login)
Login = login;
}
static void setSenha(String senha)
Senha = senha;
}
static void setNome(String nome)
Nome = nome;
}
}
Os m�todos criados nesta classe para defini��o e recupera��o de dados
n�o s�o necess�rios, pois como os dados s�o static eles n�o precisam
necessariamente dos m�todos para serem acessados.
Agora j� podemos implementar a classe password. Esta classe ser�
respons�vel por solicitar os dados do usu�rio e armazen�-lo na classe
identificacao que criamos acima.
Veja abaixo o c�digo fonte desta classe:
import java.awt.*;
import java.net.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class password extends Applet implements ActionListener
Label llogin = new Label("Login: ");
Label lsenha = new Label("Senha: ");
TextField tlogin = new TextField(10);
TextField tsenha = new TextField(10);
String login = new String();
String senha = new String();
String nome = new String();
Button ok = new Button(" OK ");
Image background;
Font defaultFont = new Font( "Dialog", Font.ITALIC, 14 );
String pagina = new String("password.html");
boolean blogin=false;
public void init()
setBackground( new java.awt.Color( 128, 128, 255 ) );
setForeground( java.awt.Color.black );
llogin.setFont( new Font( "Monospaced", Font.BOLD, 14 ) );
llogin.setBackground( new java.awt.Color( 128, 128, 255 ) );
llogin.setForeground( java.awt.Color.yellow );
lsenha.setFont( new Font( "Monospaced", Font.BOLD, 14 ) );
lsenha.setBackground( new java.awt.Color( 128, 128, 255 ) );
lsenha.setForeground( java.awt.Color.yellow );
tsenha.setEchoChar('*');
ok.setFont( new Font( "Monospaced", Font.BOLD, 14 ) );
ok.setBackground( new java.awt.Color( 0, 0, 160 ) );
ok.setForeground( java.awt.Color.white );
ok.setActionCommand("OK");
ok.addActionListener(this);
tlogin.setFont( defaultFont );
tsenha.setFont( defaultFont );
add(llogin);
add(tlogin);
add(lsenha);
add(tsenha);
add(ok);
if (getParameter("BGImage") != null)
background =
getImage(getCodeBase(),getParameter("BGImage"));
}
public void paint (Graphics g)
if (getParameter("BGImage") != null)
g.drawImage(background,0,0,this);
}
public void actionPerformed(ActionEvent evento)
Object eventTarget = evento.getSource();
if( eventTarget == ok)
identificacao id = new
identificacao(tlogin.getText(),tsenha.getText());
pegarConfiguracao();
if (getParameter("Redirect") != null)
pagina = getParameter("Redirect");
if (!blogin)
String url = new String(getCodeBase()+pagina);
try
URL conectar = new URL(url);
getAppletContext().showDocument(conectar);
}
catch(MalformedURLException erro)
System.out.println("erro");
}
}
else
String url = new
String(getCodeBase()+"autenticacao.html");
try
URL conectar = new URL(url);
getAppletContext().showDocument(conectar);
}
catch(MalformedURLException erro)
System.out.println("erro");
}
}
}
}
public void pegarConfiguracao()
StringTokenizer token;
URL url = null;
DataInputStream is = null;
String buf;
try
url = new URL(getDocumentBase(),"autentic.log");
is = new DataInputStream(url.openStream());
}
catch (Exception e)
is = null;
}
if (is == null)
System.out.println("Nao pode abrir o arquivo");
}
try
String line = null;
line = is.readLine();
int i=1;
while (line != null)
if (line.length() > 0)
token=new StringTokenizer(line,":::");
login=token.nextElement().toString();
if ((login.equals(identificacao.Login)) &&
(!blogin))
senha=token.nextElement().toString();
if (senha.equals(identificacao.Senha))
blogin = true;
if (token.hasMoreTokens())
identificacao.setNome(token.nextElement().toString());
return;
}
}
i++;
}
line = is.readLine();
}
is.close();
}
catch (IOException e)
System.out.println("Falha Geral");
}
}
}
Os pontos mais importantes da classe acima est�o identificados em
negrito. O ponto mais importante desta classe � criar um objeto da classe
identifica��o com os dados do us�rio. O fragmento do c�digo que faz isto �:
identificacao id = new
identificacao(tlogin.getText(),tsenha.getText());
Depois deste passo chamamos o m�todo pegarConfiguracao() que l� o
arquivo texto e faz a compara��o entre os dados da classe identificacao com
o arquivo texto autentic.log onde est�o armazenados os usu�rios registrados.
Pela l�gica constru�da acima o seguinte passo � verificar o resultado
deste m�todo. Se a vari�vel login estiver valendo false ent�o o usu�rio �
redirecionado para uma p�gina de erro, caso contr�rio ele se dirige para uma
p�gina de confirma��o e de boas vindas � �rea restrita.
Parece que o problema est� solucionado. Mas o usu�rio entrando uma vez
na p�gina restrita poder� ir direto para ela nas pr�ximas visitas ao site
n�o passando pela tela de password. Para resolver isto, criamos uma pequena
applet que � inserida em todas as outras p�ginas que faz a mesma verifica��o
utilizada no m�todo pegar Configuracao(). Desta forma se o usu�rio tentar
acessar a p�gina sem passar pela applet de password ele ser� redirecionado
para uma p�gina definida. Veja o c�digo fonte desta applet:
import java.awt.*;
import java.net.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class autenticacao extends Applet
Label rotulo = new Label();
String pagina = new String("password.html");
String login = new String();
String senha = new String();
String nome = new String();
boolean blogin=false;
Font defaultFont = new Font( "Dialog", Font.ITALIC, 14 );
public void init()
setBackground(Color.white);
pegarConfiguracao();
if (getParameter("Redirect") != null)
pagina = getParameter("Redirect");
}
rotulo.setFont( new Font( "Monospaced", Font.BOLD, 14 ) );
rotulo.setText("Caro(a) amigo(a) "+identificacao.Nome+".
Seja Bem-Vindo a minha Home-Page!");
add(rotulo);
}
public void start()
if (!blogin)
String url = new String(getCodeBase()+pagina);
try
URL conectar = new URL(url);
getAppletContext().showDocument(conectar);
}
catch(MalformedURLException erro)
System.out.println("erro");
}
}
}
public void pegarConfiguracao()
StringTokenizer token;
URL url = null;
DataInputStream is = null;
String buf;
try
url = new URL(getDocumentBase(),"autentic.log");
is = new DataInputStream(url.openStream());
}
catch (Exception e)
is = null;
}
if (is == null)
System.out.println("Nao pode abrir o arquivo");
}
try
String line = null;
line = is.readLine();
int i=1;
while (line != null)
if (line.length() > 0)
token=new StringTokenizer(line,":::");
login=token.nextElement().toString();
if ((login.equals(identificacao.Login)) && (!blogin))
senha=token.nextElement().toString();
if (senha.equals(identificacao.Senha))
blogin = true;
if (token.hasMoreTokens())
identificacao.setNome(token.nextElement().toString());
}
return;
}
}
i++;
}
line = is.readLine();
}
is.close();
}
catch (IOException e)
System.out.println("Falha Geral");
}
}
}
Com esta applet o problema de acesso a �reas restritras de seu site
fica mais f�cil de resolver. Antes de apresentar o link para voc� testar o
applet gostaria de fazer algumas considera��es:
a.. esta applet n�o � e n�o tenta ser uma solu��o final para a
seguran�a de seus dados na WEB;
b.. uma solu��o mais segura para esta applet � acessar os dados do
usu�rio a partir de um banco de dados, j� que o mesmo oferece maior
seguran�a quando comparado a arquivos texto.
Visite a p�gina password.html e veja a applet em funcionamento.
Se quiser pode baixar tamb�m a applet com os c�digos fontes e arquivos
necess�rios para o funcionamento da mesma.
password.java
autenticacao.java
identificacao.java
password.class
autenticacao.class
identificacao.class
autentic.log
Neg�cios | Marketing | Tecnologia
HOME
----- Original Message -----
From: "jdkrocha" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, May 21, 2001 3:06 PM
Subject: [java-list] trocando password
> Presados usuarios da lista.
>
> Essa � a primeira vez que escrevo para essa lista, e agora estou
precisando de
> uma m�ozinha.
> Alguem conhece algum servlet ou applet que posso usar para que um usuario
possa
> trocar sua propria senha atravez de um browser???
>
> Atenciosamente,
>
>
> --
> �v� Secretaria de Estado da Fazenda
> /(_)\ Jos� Carlos Rocha (linux user)
> ^ ^
>
>
> ------------------------------ LISTA SOUJAVA ----------------------------
> http://www.soujava.org.br - Sociedade de Usu�rios Java da Sucesu-SP
> d�vidas mais comuns: http://www.soujava.org.br/faq.htm
> regras da lista: http://www.soujava.org.br/regras.htm
> para sair da lista: envie email para [EMAIL PROTECTED]
> -------------------------------------------------------------------------
>
>
applet01.gif
wwlogo_topo.gif
barra_ww2.gif