Não consigo autenticar a senha

Olá pessoal,

To utilizando o Eclipse e Oracle 10g.

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);

Bom, vamos lah:

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]Bom, vamos lah:

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.

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=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!

Abraços!

Pessoal, resolvi utilizando o gettext do controle, assim ele retorna o que foi digitado pelo usuário.

Valeu.