Gravei um login e uma senha na tabela de usuário. Fiz uma classe Login e quando o usuário digita o login e senha tento validar no banco, estou conseguindo validar o login mas não estou conseguindo autenticar a senha.
incluir_JB.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
if(loginTF.getText().equalsIgnoreCase("") || senhaTF.getPassword().equals(""))
{
JOptionPane.showMessageDialog(null, "Login e senha obrigatório!");
loginTF.requestFocus();
return;
}
DAO d = new DAO();
int achou = 0;
try{
if(d.Consultar("select * from usuario"))
{
while(d.GetConsulta().next())
{
if((d.GetConsulta().getString("login").equalsIgnoreCase(loginTF.getText())) &&
(d.GetConsulta().getString("senha").equals(senhaTF.getPassword())))
{
d.Close();
dispose();
new MenuOpcoes();
}
else
achou = 1;
}
d.Close();
if (achou == 1)
JOptionPane.showMessageDialog(null, "Usuário não cadastrado!");
}
}
catch(Exception ex){return;}
}
});
incluir_JB.setText("Entrar");
getContentPane().add(incluir_JB);
Primeiro, não coloque acesso a banco direto do seu controller (a classe que você postou), crie uma camada de negócio que, somente ela tenha acesso aos DAO’s. Nessa classe, apenas faça validações e controle de fluxo.
Segundo, codigo SQL e informações referentes a estrutura de tabela (nomes de coluna, etc) apenas na camada DAO.
Terceiro, para ficar mais facil de achar o erro, primeiro passe o usuario como parametro p/ DAO para que o banco faça o loop e não o java (adicionando uma clausular where usuario = ? no seu select). Fazendo isso você sabe mais facilmente se o usuario existe na base e faz somente a comparação de uma senha no java. Faça debug ou de um print nos resultados de senha que você recebeu da tela e do banco para entender onde está o erro.
Primeiro, não coloque acesso a banco direto do seu controller (a classe que você postou), crie uma camada de negócio que, somente ela tenha acesso aos DAO’s. Nessa classe, apenas faça validações e controle de fluxo.
Segundo, codigo SQL e informações referentes a estrutura de tabela (nomes de coluna, etc) apenas na camada DAO.
Terceiro, para ficar mais facil de achar o erro, primeiro passe o usuario como parametro p/ DAO para que o banco faça o loop e não o java (adicionando uma clausular where usuario = ? no seu select). Fazendo isso você sabe mais facilmente se o usuario existe na base e faz somente a comparação de uma senha no java. Faça debug ou de um print nos resultados de senha que você recebeu da tela e do banco para entender onde está o erro.[/quote]
Hover,
Valeu pelas orientações, realmente preciso trabalhar por camadas, mas preciso também de orientação de como comparar nesse modelo a senha que o usuário está passando com a senha que está no banco. Valeu…
Então, para resolver seu problema imediato, altere a query para incluir a clausula where, vai ficar mais facil de isolar o erro, se mesmo assim não consegui, poste nesta thread mais especificamente que problema você está tendo.
Para adiantar, tanto
d.GetConsulta().getString("senha") como senhaTF.getPassword() retornam uma String, correto?
De um println e coloque o resultado aqui se não conseguir resolver.
[quote=NNP]Fiz o print e pude ver que a senha[color=red] teste[/color] está retornando de uma forma diferente da que o usuário está passando.
Print:
Banco = [C@198a455
senhaTF = [C@ba6c83
Outra observação é que cada vez que clico em ok na tela de login ele passa uma criptografia diferente
3X
Banco = [C@198a455
senhaTF = [C@29428e
Banco = [C@198a455
senhaTF = [C@b1b4c3
Banco = [C@198a455
senhaTF = [C@72ffb[/quote]
Você está usando um PasswordField?
Se sim, quando você vai pegar um valor dele, vem dessa maneira que você escreveu aí.
Quando receber o valor de um JPasswordField, faça assim:
String senha = new String(passwordField.getPassword());
Assim, ele pegará o valor que foi digitado pelo usuário.
Quando à autenticação do usuário, você pode fazer assim:
No seu DAO, crie um método buscarUsuario(String usuario, String senha):
public Usuario buscarUsuario(String usuario, String senha) throws Exception
{
Object[] params = { usuario, senha };
String query = String.format("Select * From Usuario Where Usuario = %s And Senha = %s", params);
PreparedStatement pstm = conn.prepareStatement(query);
ResultSet rs = pstm.executeQuery();
Usuario usuario = null;
if ( rs != null )
{
if ( rs.next() )
{
// Popula o objeto...
}
}
return usuario;
}
Se retornar NULL, quer dizer que ou o usuário ou senha está(ão) errados!