Validar login e senha fazendo busca no arquivo csv

Olá!
Estou com dificuldade de validar login e senha de usuário percorrendo um arquivo.csv.
No meu código não está validando. Preciso de ajuda, pfv!

String userName = jtxtUsuario.getText();
String pass = jSenha.getText();
String linha = new String();
String nomeArquivo  = "C:\\usuarios.csv";

File arq = new File(nomeArquivo);

if(arq.exists()) {
	FileReader leitorArquivo = null;
	
	try {
		leitorArquivo = new FileReader(nomeArquivo);
	} catch (FileNotFoundException ex) {
		Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
	}
	
	BufferedReader br = new BufferedReader(leitorArquivo);
	
	while(true) {
		try {
			linha = br.readLine();
			
			for (int i = 0; i > linha.length(); i++) {
				String[] result = linha.split(";");
				
				if (userName.equals(linha)&& (pass.equals(linha))){
					System.out.println("userName, login " + userName );
					System.out.println("pass, senha " + pass);
					System.out.println("result " + result);
					//System.out.println("obj " + obj);
					KitControlForm kc = new KitControlForm();
					kc.setVisible(true);
					dispose();
				}
			}
		} catch (IOException ex) {
			Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
		}
		
		System.out.println("linha " + linha);
		
		if(linha == null) {
			break;
		}
	}
}
1 curtida

Acredito que essa parte esteja errada. Você está comparando se o userName é igual a linha e se o pass também é igual a linha. Acho meio difícil a linha toda ser o userName e o password ao mesmo tempo.

Lembre-se que o CSV pode possuir vários dados na mesma linha, e que esses dados são separados por um delimitador (no seu caso, por ;).

Como ficaria, devo fazer por coluna? fiz dessa forma, mas tambem nao deu certo.

         Scanner sc = null;
             try {
                 sc = new Scanner(new File("C:\\usuarios.csv"));
             } catch (FileNotFoundException ex) {
                 Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
             }
        while(sc.hasNextLine()) {
            String linha = sc.nextLine();
            
            String[] colunas = linha.split(";");
            System.out.println("linha " + linha);
            System.out.println("colunas " + colunas[0]);
            if ((colunas.equals(userName)) && (colunas.equals(pass))){
                KitControlForm kc = new KitControlForm();
                kc.setVisible(true);
                dispose();
                   
            }else{
                if (userName.equals(linha)&& (pass.equals(linha))){
                    
                }
            }
    }

Supondo que uma linha do seu CSV seja assim:

userNameAAA;passBBB

O seu código poderia ficaria assim:

String linha = sc.nextLine();
String[] colunas = linha.split(";");

String userNameValue = colunas[0]); // userNameAAA
String passValue = colunas[1]); // passBBB

if (userNameValue.equals(userName) && passValue.equals(pass)) {
    // ...
}

Como ficaria para 5 logins e senhas na lista? Só sei que seria um for mas esse for fica antes ou depois da condição?

O seu código já atenderia pois já está dentro de um while

Scanner sc = null;

try {
	sc = new Scanner(new File("C:\\usuarios.csv"));
} catch (FileNotFoundException ex) {
	Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
}

while(sc.hasNextLine()) {
	String linha = sc.nextLine();
	String[] colunas = linha.split(";");
	
	String linha = sc.nextLine();
	String[] colunas = linha.split(";");
	
	String userNameValue = colunas[0]);
	String passValue = colunas[1]);
	
	if (userNameValue.equals(userName) && passValue.equals(pass)) {
		KitControlForm kc = new KitControlForm();
		kc.setVisible(true);
		dispose();
	}
}

Obrigada, vou testar aqui.

Agora vc tem que ver o que vai fazer com o resultado, pois, caso encontra o username e o password no CSV, vc está criando uma instância do objeto KitControlForm, porém, vc não está fazendo nada com ele.

Se o resultado do login e senha for verdadeiro eu quero abrir a tela principal e fechar a tela de login.

Ah sim, então esse KitControlForm é uma janela. Entendi.

Não consigo pegar as duas colunas, já tentei de várias formas mas o resultado só tras a primeira coluna.

userNameValue
linha adm;adm
userNameValue adm
linha usu;123
userNameValue usu

  Scanner sc = null;
             try {
                 sc = new Scanner(new File("C:\\usuarios.csv"));
             } catch (FileNotFoundException ex) {
                 Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
             }
        while(sc.hasNextLine()) {
            String linha = sc.nextLine();            
            String[] colunas = linha.split(";");
            
         //   String[] coluna1 = linha.split(";");
            String userNameValue = colunas[0];
         //   String passValue = colunas[1];
            
            System.out.println("linha " + linha);  
      //      System.out.println("passValue " + passValue);
            System.out.println("userNameValue " + userNameValue);
        //    System.out.println("coluna1 " + coluna1[1]);
            if ((colunas.equals(userName)) && (colunas.equals(pass))){
                KitControlForm kc = new KitControlForm();
                kc.setVisible(true);
                dispose();
                   
            }else{
                if (userName.equals(linha)&& (pass.equals(linha))){
                    
                }
            }
    }

Manda o conteúdo do seu CSV pra gente ver.

usuarios.csv (57 Bytes)

mandei

Oi sandy.

Fiz um teste aqui e funcionou:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 *
 * @author Abner
 */
public class LerCSV {

    public static void main(String[] args) {
        String arquivo = "C:\\Imperium\\Usuarios.csv"; //Seu arquivo
        BufferedReader buff = null;
        String linha = "";
        String separacao = ";"; //Se a separação das colunas é: . ou , ou ;
        try {
            buff = new BufferedReader(new FileReader(arquivo));
            //Leitura de linha por linha, não imprimindo a última linha: null
            while ((linha = buff.readLine()) != null) {
                String[] leitura = linha.split(separacao);
                //leitura[0]: representa a primeira coluna, leitura[1]: a segunda coluna, e assim sucessivamente.
                System.out.println("Usuário= " + leitura[0] + ", Senha= " + leitura[1]);
                //Verificação
                if (leitura[0].equals("adm") && leitura[1].equals("adm")) {
                    System.out.println("Login Efetuado com sucesso");
                }
            }
        } catch (FileNotFoundException e) {
            System.out.println("Arquivo não encontrado.\nErro:" + e);
        } catch (IOException e) {
            System.out.println("Erro ao abrir arquivo.\nErro: " + e);
        } finally {
            //Fechando leitura do arquivo (Caso queira usa-lo depois)
            if (buff != null) {
                try {
                    buff.close();
                } catch (IOException e) {
                    System.out.println("Erro ao fechar arquivo.\nErro: " + e);
                }
            }
        }
    }

No seu caso é usando o Scanner, então é só trocar o .equals("adm") pela sua variável.


Edit:

Fiz um exemplo com o Scanner e funcionou tranquilo tbm, resultado:

Olá, diga-nos o seu nome: 
adm
Ok, agora digite a sua senha: 
adm
Você digitou: adm, adm

Ok, lendo o arquivo...
Por favor, aguarde.

Usuário= login, Senha= senha
Usuário= adm, Senha= adm
Login Efetuado com sucesso
Usuário= usu, Senha= 123
Usuário= joao, Senha= 321

Resumindo, cria o Scanner normalmente e depois muda a condição:

//Verificação                
if (leitura[0].equals(nome) && leitura[1].equals(senha)) {
    System.out.println("Login Efetuado com sucesso");
}

Deu certo.

private void validaLogin() {
    
    String userName = jtxtUsuario.getText();
    String pass = jtxtSenha.getText();
    String arquivo = "C:\\Usuarios\\usuarios.csv"; 
    BufferedReader buff = null;
    String linha = "";
    String separacao = ";"; 
    try {
        buff = new BufferedReader(new FileReader(arquivo));
        //Leitura de linha por linha, não imprimindo a última linha: null        
       
        while ((linha = buff.readLine()) != null) {
            String[] leitura = linha.split(separacao);
            //leitura[0]: representa a primeira coluna, leitura[1]: a segunda coluna, e assim sucessivamente.
            System.out.println("Usuário= " + leitura[0] + ", Senha= " + leitura[1]);
            //Verificação
            
              if (leitura[0].equals(userName) && leitura[1].equals(pass)) {
       //     if (leitura[0].equals("adm") && leitura[1].equals("adm")) {
                System.out.println("Login Efetuado com sucesso");
                                 
                   TelaPrincipal tp = new TelaPrincipal ();
                   tp.setVisible(true);
                   dispose();

               }
              System.out.println("senha incorreta");
              JOptionPane.showMessageDialog(null, "Usuário ou senha está incorreto!");
                          }      
          
    } catch (FileNotFoundException e) {
        System.out.println("Arquivo não encontrado.\nErro:" + e);
         
    } catch (IOException e) {
        System.out.println("Erro ao abrir arquivo.\nErro: " + e);
        
    } finally {
        //Fechando leitura do arquivo (Caso queira usa-lo depois)
        if (buff != null) {
            try {
                buff.close();
            } catch (IOException e) {
                System.out.println("Erro ao fechar arquivo.\nErro: " + e);
                
            }
           
        }
     }

Só não estou acertando onde colocar a mensagem de erro: login e senha incorreto.
}
System.out.println(“senha incorreta”);
JOptionPane.showMessageDialog(null, “Usuário ou senha está incorreto!”);
}

coloquei como estava no exemplo que vc passou, mas exibe a mensagem mais de uma vez. Acredito que é porcausa do loop. Mas já tentei colocar em outros lugares e nao tá dando certo.

Preciso de ajuda Urgente!!!Podem me ajudar!!
Não consigo validar o login e senha, não tá dando certo o codigo, só ler a primeira linha qdo dou break; qdo tiro fica repetindo a msg do JOptionpane na condição if e else.

String userName = jtxtUsuario.getText();
String pass = jSenha.getText();
String arquivo = “C:\Usuarios\usuarios.csv”;

    BufferedReader buff = null;
    String linha = "";
    String separacao = ";"; 
    try {
        buff = new BufferedReader(new FileReader(arquivo));
        //Leitura de linha por linha, não imprimindo a última linha: null        
       
        while ((linha = buff.readLine()) != null) {
            String[] leitura = linha.split(separacao);
            //leitura[0]: representa a primeira coluna, leitura[1]: a segunda coluna, e assim sucessivamente.
            System.out.println("Usuário= " + leitura[0] + ", Senha= " + leitura[1]);
           
              //Verificação
               if (leitura[0].equals(userName) && leitura[1].equals(pass)) {
       //     if (leitura[0].equals("adm") && leitura[1].equals("adm")) {
                 
                System.out.println("Login Efetuado com sucesso");
                 //  System.setProperty("login",userName);          
                   TelaPrincipal tp = new TelaPrincipal(userName);
                   tp.setVisible(true);
                   String jlblOperadorNome = userName;
                   dispose();
                   break;
               }else{
              if (!leitura[0].equals(userName) ) {
                  
              System.out.println("login ou senha incorreto " + userName  );                
              
             JOptionPane.showMessageDialog(null, "login ou senha incorreta!");
          //  break;
              
             
        }  
              
        }       
               
      }     
       
          
    } catch (FileNotFoundException e) {
        System.out.println("Arquivo não encontrado.\nErro:" + e);
         
    } catch (IOException e) {
        System.out.println("Erro ao abrir arquivo.\nErro: " + e);
        
    } finally {
        //Fechando leitura do arquivo (Caso queira usa-lo depois)
        if (buff != null) {
            try {
                buff.close();
            } catch (IOException e) {
                System.out.println("Erro ao fechar arquivo.\nErro: " + e);
                
            }
           
        }
     }
   
}

@sandy
Boa tarde, amigos.

Tem bastante gente ajudando mas vou deixar minha contribuição como sempre. Segue:

package br.com.sres.gutxml.teste;

import java.io.File;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;

public class Testes {

    public static void main(String[] args) {
        Testes t = new Testes();
        t.login(jtxtUsuario.getText(), jSenha.getText(), "C:\\Usuarios\\usuarios.csv");
    }

    public void login(String userName, String pass, String arquivo) {
        if (validaLogin(userName, pass, arquivo)) {
            System.out.println("Login Efetuado com sucesso");
            openTelaPrincipal();
        } else {
            System.out.println("login ou senha incorreto");
            JOptionPane.showMessageDialog(null, "login ou senha incorreta!");
        }

    }

    public void openTelaPrincipal() {
        TelaPrincipal tp = new TelaPrincipal(userName);
        tp.setVisible(true);
        String jlblOperadorNome = userName;
        this.dispose();
    }

    public boolean validaLogin(String user, String senha, String arquivo) {
        boolean sucess = false;
        Map<String, String> mapUser = new HashMap();
        getLines(arquivo)
                .forEach(l -> {
                    String[] strs = l.split(";");
                    mapUser.put(strs[0], strs[1]);
                });
        if (mapUser.containsKey(user)) {
            return mapUser.get(user).equals(senha);
        }
        return sucess;
    }

    public List<String> getLines(String path) {
        List<String> lines = new ArrayList();
        try {
            lines = Files.readAllLines(new File(path).toPath());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return lines;
    }

}

Espero que ajude em algo. :metal::sunglasses::metal:

1 curtida

Obrigada! Deu certo.