Login usuario não esta entrando Desktop

16 respostas
K

Oi turma,blz! bem estou fazendo um programa de estoque para desktop, na hora da autenticação o usuario adm e senha adm não esta entrando no banco, so que quando vou atenticar ele como teste que é somente leitura, ele esta entrando normalmente... aqui abaixo esta o codigo....

b
oolean auxiliar = true;
           if ( tf_login1.getText().equals("") || tf_senha1.getText().equals(""))

           JOptionPane.showMessageDialog(null,"Os campos login e senha não podem ser vazios");
           else
           {
               try {
                   if(auxiliar == true){
                       String sql = "select * from usuario Where nome like'"+
                       tf_login1.getText()+"' and senha like'"+
                       tf_senha1.getText()+"' and nivel = 'adm'";
                       con_usuario.executeSQL(sql);
                       if (con_usuario.resultset.first())
                       {
                           System.out.println("Dentro do IF do ADM");

                           new cad_impressoras().show();
                           usuario.this.dispose();
                       }else{
                           System.out.println("Dentro do ELSE do ADM");
                           auxiliar = false;
                       }

                       String sql1 = "select * from usuario Where nome like'"+
                       tf_login1.getText()+"' and senha like'"+
                       tf_senha1.getText()+"' and nivel = 'leitura'";
                       con_usuario.executeSQL(sql1);
                       if ( con_usuario.resultset.first())
                       {
                           System.out.println("Dentro do IF do TESTE");
                           // JOptionPane.showMessageDialnog(null,"Conectado!");
                           auxiliar = true;
                           new cad_impressorasleitura().show();
                           usuario.this.dispose();
                       }
                   }
                   if(auxiliar == false){
                       JOptionPane.showMessageDialog(null,"Login ou Senha não conferem!");
                   }
               }
                catch (SQLException erro) {
                    erro.getMessage();
               }                
        }

16 Respostas

bdias1990

manda o codigo disso: con_usuario.executeSQL(sql)

E

Aimeudeus, o cara usa “like” para bater um usuário e senha? Vou entrar com usuário = “%” e senha = “%”, e ver o que acontece.

bdias1990

aimeudeus foi boa kkkkkkkkkkkkkkkkkkkkkkk

ViniGodoy

entanglement:
Aimeudeus, o cara usa “like” para bater um usuário e senha? Vou entrar com usuário = “%” e senha = “%”, e ver o que acontece.

O pior é que ele só testa pelo “first”. Nem pra ver se o nome retornado é sequer parecido com o fornecido…

Aí a gente fica repetindo pra usar PreparedStatement e o povo não acredita…

Anime

Pelo jeito o pessoal aq nasceu sabendo…

É evidente que se ele soubresse tudo,não entraria no forum,esperando que pessoas mais experientes o ajuda-se.

Da uma olhadinha aq:
http://www.youtube.com/results?search_query=login+java+se

ViniGodoy

Anime, valeu pelo puxão de orelha.

kerbage, o mais certo seria fazer mais ou menos assim:

if ( tf_login1.getText().equals("") || tf_senha1.getText().equals(""))
   JOptionPane.showMessageDialog(null,"Os campos login e senha não podem ser vazios");
   return; //Vamos usar o return para cair fora de uma vez, assim não precisamos do else
}

try {
   //As ? serão substituídas pelos valores. E nem precisa colocar entre aspinhas.
   String sql = "SELECT * FROM usuario WHERE nome = ? AND senha = ? AND (nivel='adm' OR nivel='leitura')";
   PreparedStatement stmt = con_usuario.prepareStatement(sql);
   //Aqui definimos os valores que vão nas ?
   stmt.setString(1, tf_login1.getText());
   stmt.setString(2, tf_senha1.getText());

   //E executamos a query.
   ResultSet rs = stmt.executeQuery();

   if (!rs.next()) { 
      //Não retornou ninguém? Dá erro e cai fora.
      JOptionPane.showMessageDialog(null,"Login ou Senha não conferem!"); 
      return;
   }

   //vamos descobrir o nível de quem retornou. Assim só fazemos 1 única consulta.
   String nivel = rs.getString("nivel"); 
   if (nivel.equals("adm")) {
      System.out.println("Dentro do IF do ADM");  
      new cad_impressoras().show();  
      usuario.this.dispose();  
   } else if (nivel.equals("leitura") {
      System.out.println("Dentro do IF do TESTE"); 
      new cad_impressorasleitura().show();  
      usuario.this.dispose();  
   }
catch (SQLException erro) {
   e.printStackTrace(); //É bom imprimir a mensagem de erro.
   erro.getMessage();
}

Com o preparedStatement, se o usuário tentar digitar um SQL, como fez o entanglement, esse SQL será encarado como texto. Nunca como SQL. Não é possível, por exemplo, o usuário digitar uma senha como ' OR true = true OR ' e isso fazer com que todos os registros do sistema sejam retornados. Por isso, o teste com next() fica seguro.

O PreparedStatement é geralmente a melhor opção pois com ele quem se preocupa com o tipo de dados é o próprio banco. Você não precisa passar datas num formato específico (basta usar o tipo Date do Java), nem se preocupar em escrever as aspas simples do SQL (ou retira-las, caso seu usuário as tenha escrito).

Note também o uso da técnica de code guard. Ou seja, se existe uma condição que faz o método sair, testamos ela o mais cedo possível e saímos do método com return. Isso evita else (e a consequente endentação do else), deixa o código mais legível e mais fácil de entender. Não há dúvidas para o programador que lê o programa que o return sai do método, então ele não precisa ler o resto do código inteiro para entender isso.

O método first() não pode ser usado por qualquer recorset. Para usa-lo, você deve usar um recordset navegável. A sorte é que ele raramente é necessário. Normalmente, o resultset é aberto antes do primeiro registro. E, para ler a primeira linha, você precisa chamar pelo menos uma vez o método next(). Se não houver nenhuma linha lá, o next() retorna false, exatamente como você imaginava que ocorreria com o first(). A vantagem dessa abordagem é que fica fácil percorrer um resultset, já que você pode fazer direto:
rs = stmt.executeQuery();
while (rs.next()) { //O primeiro next() pula pro primeiro registro! :)
   //faz qualquer coisa
}

Por fim, procure evitar variáveis como aquela "auxiliar" ali. Fica meio obscuro o papel dela até o final do método. Note como organizei o código de modo que ela ficou completamente desnecessária. Legibilidade de código deve ser uma prioridade.

Anime

Valeu pela aula…

K

anime e ViniGodoy valeu pelo ensinamento! estou aqui é para aprender e não para humilher as pessoas… uma das coisas que este forum faz é tirar duvidas e não humilhar as pessoas…

K

esqueci, alem da aula que vc apresentou para a gente ViniGodoy, gostaria de aprofundar mais no assunto, qual material vc sugere para o meu estudo…
obrigado pela atenção

ViniGodoy

Tem o artigo oficial da Oracle:
http://download.oracle.com/javase/tutorial/jdbc/basics/index.html

E vários do GUJ:
http://www.guj.com.br/article.show.logic?id=115
http://www.guj.com.br/article.show.logic?id=120
http://www.guj.com.br/article.show.logic?id=125
http://www.guj.com.br/article.show.logic?id=174
http://www.guj.com.br/article.show.logic?id=182

E

Olá alguém pode me orientar? estou usando postgresql
nesse código.

[color=blue]try[/color] {

[color=green] //As ? serão substituídas pelos valores. E nem precisa colocar entre aspinhas.[/color]

Conexao con = new Conexao();

String SQL = SELECT login, senha FROM cadastrarusuario WHERE login = ? AND senha = ? AND (funcao=Admin OR funcao=Operador)’”;

con_usuario.executeSQL(SQL);

PreparedStatement stmt = con_usuario.getConexao().prepareStatement(SQL);

//Aqui definimos os valores que vão nas ?

stmt.setString(1, Login.getText());

stmt.setString(2, Senha.getText());

//E executamos a query.

ResultSet rs = stmt.executeQuery();

if  (!rs.next()) {

//Não retornou ninguém? Dá erro e cai fora.

JOptionPane.showMessageDialog(null,Login ou Senha não conferem!);

return;

}

//vamos descobrir o nível de quem retornou. Assim só fazemos 1 única consulta.

String funcao = rs.getString(funcao);

if (funcao.equals(Admin)) {

JOptionPane.showMessageDialog(null,Admin!);

new JtelaPrincipal1().setVisible(true);

this.dispose();

}else{

if (funcao.equals(Operador)) {

JOptionPane.showMessageDialog(null,operador!);

new TelaCaixa().show();

this.dispose();

}

}

}[color=blue]catch[/color] (SQLException erro) {

e.printStackTrace(); //É bom imprimir a mensagem de erro.

JOptionPane.showMessageDialog(null, "ERRO SQL: "+erro.getMessage());

}

da essa mensagem de erro!
ERRO: erro de sintaxe em ou próximo a “AND”
Posição:67

adriano_si

Eliene, quando for postar código, use a tag CODE do fórum, ela nos ajuda a visualizar facilmente o problema.

Reveja seu trecho colado aqui:

String SQL = "SELECT login, senha FROM cadastrarusuario WHERE login = ? AND senha = ? AND (funcao='Admin' OR funcao='Operador)'";

A última Aspa do valor Operador está fora do parêntese que está fechando.

Mais uma dica, para o que você quer fazer, você pode usar uma função SQL in()

Seu SQL ficaria assim:

String SQL = "SELECT login, senha FROM cadastrarusuario WHERE login = ? AND senha = ? AND funcao in('Admin','Operador')";

Abs []

E

Obrigado pelas dicas ma continua dando o mesmo erro! ERRO: erro de sintaxe em ou próximo a "AND"
Posição:67

private void AcessarActionPerformed(java.awt.event.ActionEvent evt) {                                        
        if ( Login.getText().equals("") || Senha.getText().equals("")){  
                    JOptionPane.showMessageDialog(null,"Os campos login e senha não podem ser vazios");  
                    return; //Vamos usar o return para cair fora de uma vez, assim não precisamos do else  
            }  
        try {  
                //As ? serão substituídas pelos valores. E nem precisa colocar entre aspinhas.  
                Conexao con = new Conexao();
                String SQL = "SELECT login,senha,funcao FROM cadastrarusuario WHERE login = ? AND senha = ? AND funcao in ('Admin','operador')";  
            
                con_usuario.executeSQL(SQL);
                PreparedStatement stmt = con_usuario.getConexao().prepareStatement(SQL);  
                //Aqui definimos os valores que vão nas ?  
                stmt.setString(1, Login.getText());  
                stmt.setString(2, Senha.getText());  
      
                //E executamos a query.
                
                ResultSet rs = stmt.executeQuery();  
      
            if (!rs.next()) {   
                //Não retornou ninguém? Dá erro e cai fora.  
                JOptionPane.showMessageDialog(null,"Login ou Senha não conferem!");   
                return;  
            }  
      
                //vamos descobrir o nível de quem retornou. Assim só fazemos 1 única consulta.  
                String Funcao = rs.getString("funcao");
                 
            if (Funcao.equals("Admin")) {  
                JOptionPane.showMessageDialog(null,"Admin!");    
                new JtelaPrincipal1().setVisible(true);
                this.dispose();    
            }else{ 
                if (Funcao.equals("operador")) {  
                    JOptionPane.showMessageDialog(null,"operador!");  
                    new TelaCaixa().show();    
                    this.dispose();    
                }
            }
        }catch (SQLException erro) {  
                //e.printStackTrace(); //É bom imprimir a mensagem de erro.  
                JOptionPane.showMessageDialog(null, "ERRO SQL: "+erro.getMessage());                   
        }                  
    }
E

bom seu digitar o login ou senha invalido ele mostra mensagem!
JOptionPane.showMessageDialog(null,“Login ou Senha não conferem!”);

K

Caramba como faz tempo! mais mesmo assim quero agradecer pela aula que vocês me deram. Faz o que uns 3 anos ?

pmlm

elienaialves:
Obrigado pelas dicas ma continua dando o mesmo erro! ERRO: erro de sintaxe em ou próximo a “AND”
Posição:67

Se tirares a linha 11, que não está aí a fazer nada, o erro desaparece.

Criado 19 de agosto de 2010
Ultima resposta 14 de out. de 2014
Respostas 16
Participantes 8