[RESOLVIDO] Validar senha com Swing + DAO

9 respostas
J

[Estou usando Netbeans 6.9, swing, jdbc, dao)

O JTable (que carregada os dados do BD) apresenta 3 colunas (id, login e senha).

Dados da coluna 'senha' não são mostradas.

Seleciono uma linha a ser alterada, clico em um JButton e abre-se um JDialog com os dados da linha selecionada, onde digita-se:
- (JTextFields): login / senha atual / senha nova / confirmação de senha nova.

Ao clicar em JButtonSalvar, quero antes fazer a validação de login/senha (para garantir que aquele usuário poderá alterar apenas o seu próprio login/senha). E é isso que não estou conseguindo fazer funcionar.

Eis os trechos dos códigos pertinentes a questão:
private void btSalvarUserActionPerformed(java.awt.event.ActionEvent evt) {                                             
      
      // Quero comparar a senha correspondente ao do login que foi selecionado na JTable, mas a senha não aparece . Tenho que fazer uma consulta "interna" via DAO e retornar a senha daquele login e/ou id. 

        try {
            // criei esses métodos getPassLogin(String) localizados no DAO, mas não funcionou:
            if (!(txtPsw1.getText().equals((usrDAO.getPassLogin(x)).toString())))    // verifica se o usuário digitou a senha do login selecionado 
{  
                JOptionPane.showMessageDialog(this, "A senha atual não confere.", "Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }

        } catch (SQLException ex) {
            Logger.getLogger(alterUserDialog.class.getName()).log(Level.SEVERE, null, ex);
        }

       int result = JOptionPane.showConfirmDialog(this, "Confirma os dados ?");
        if (result != 0) {
            return;
        }
        try { // este trecho não é executado
            usrInEdit.setLogin(txtUser.getText());  // captura o login validado
            usrInEdit.setPsw(txtPsw3.getText());  // captura a senha validada
            usrDAO.updateUser(usrInEdit); // atualiza o BD via DAO 
            JOptionPane.showMessageDialog(this, "Dados alterados com sucesso.");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
}
Alguém sabe ?

9 Respostas

V

Amigo,

Uma dica seria vc não comparar somente a senha, mas sim usuário + senha, isso porque 2 usuários podem querer utilizar a mesma senha.

Agora não entendi o seu problema, qual parte não esta funcionando?

Até +!

J

vinnysoft:
Amigo,

Uma dica seria vc não comparar somente a senha, mas sim usuário + senha, isso porque 2 usuários podem querer utilizar a mesma senha.

Agora não entendi o seu problema, qual parte não esta funcionando?

Até +!


Ops, esqueci de avisar: minha coluna ‘login’ é única.

O meu problema é os seguinte: vide linha 30 a 43 do código.

V

Amigo,

So ta aparecendo no seu codigo linha 1 a linha 29. Mas tenta o seguinte, tenta trocar o:

if (result != 0)

por

if (result == JOptionPane.OK_OPTION)

Até +.

J

vinnysoft:
Amigo,

So ta aparecendo no seu codigo linha 1 a linha 29. Mas tenta o seguinte, tenta trocar o:

if (result != 0)

por

if (result == JOptionPane.OK_OPTION)

Até +.

[Desculpe, eu editei a mensagem pra encurtar, e não reparei que não temos mais as linhas 30 a 43.]

Então, o único problema que estou tendo é o de ‘pegar’ a senha no BD (via DAO) e devolvê-la para ser comparada com a senha digitada (vide linha 7).

V

Já tentou colocar:

System.out.println(usrDAO.getPassLogin(x)).toString());

e

System.out.println(txtPsw1.getText());

ou mesmo um breakpoint para saber se o valor das variáveis está sendo capturado, e se realmente elas são as mesmas?

Talvez seja problema no seu SELECT, tem como postar o código do usrDao.getPassLogin()?

Pode também fazer normalmente esta comparação através de um ResultSet, comparando o resultado dele com o digitado pelo usuário. Ex:

PreparedStatement ps = con.prepareStatement("Select * from Usuarios where Senha='"txtPsw1.getText()'");
ResultSet rs = ps.executeQuery();
if (rs.first())
        {
          //Se retornar algum registro, é pq existe esta senha no banco! Pode colocar código aqui. Seria mais seguro comparar usuario + senha, pois pode existir senha repetida.
         }

Até +!

J

Consegui.

Meu projeto é assim: na tela inicial é possível qualquer usuário apenas consultar os dados. Para acessar o ‘modo Gerenciamento do BD’, eu já havia criado o método abaixo:

public boolean isValidUserAndPassword(String login, String password) throws SQLException {
        boolean toReturn = false;
        ResultSet rs = executeQuery("SELECT * FROM ADMIN.USERS WHERE LOGIN = ? AND PSW = ?", login, password);
        if (rs.next()) {
            toReturn = true;
        }
        rs.close();
        return toReturn;
    }

Então, com a dica que o vinnysoft me deu, só precisei implementar no ‘ButtonActionPerformed’:

try {
            if (!(usrDAO.isValidUserAndPassword(txtUser.getText(), txtPsw1.getText()))) {
                JOptionPane.showMessageDialog(this, "O login/senha atual não confere.", "Validação", JOptionPane.WARNING_MESSAGE);
                txtPsw1.requestFocus();
                txtPsw1.selectAll();
                return;
            }
            
            int result = JOptionPane.showConfirmDialog(this, "Confirma os dados ?", "Salvar alterações", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (result != 0) {
                return;
            }
            usrInEdit.setLogin(txtUser.getText());
            usrInEdit.setPsw(txtPsw3.getText());
            usrDAO.updateUser(usrInEdit);
            JOptionPane.showMessageDialog(this, "Dados alterados com sucesso.");

Obrigado pelo apoio !

J

jMarcel:
vinnysoft:
Amigo,

So ta aparecendo no seu codigo linha 1 a linha 29. Mas tenta o seguinte, tenta trocar o:

if (result != 0)

por

if (result == JOptionPane.OK_OPTION)

Até +.

Essas expressões são equivalentes (JOptionPane.OK_OPTION == 0).

[Desculpe, eu editei a mensagem pra encurtar, e não reparei que não temos mais as linhas 30 a 43.]

Então, o único problema que estou tendo é o de ‘pegar’ a senha no BD (via DAO) e devolvê-la para ser comparada com a senha digitada (vide linha 7).

V

Blz jMarcel!

Não esquece de colocar resolvido no tópico!

Até +!

J

vinnysoft:
Blz jMarcel!

Não esquece de colocar resolvido no tópico!

Até +!

Deixa comigo !

Se estiver interessado, veja meu outro tópico referente a comunicação entre frames. Talvez lhe interesse.

http://www.guj.com.br/java/239589-passar-parametro-entre-jdialog#1235994

Até mais !

Criado 19 de abril de 2011
Ultima resposta 25 de abr. de 2011
Respostas 9
Participantes 2