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