Как сравнить учетные данные для входа в базу данных, используя JDBC (PostgreSQL)

1

Поэтому я пытаюсь создать простой чат-мессенджер в Eclipse. В настоящий момент я не понимаю, как сравнить данные входа в систему пользователей с данными, хранящимися в таблице базы данных. У меня есть метод "askName()", который использует имя пользователя и пароль, поэтому для проверки сведений, хранящихся в таблице "Вход" в базе данных, необходимо использовать мой метод "authenticate".

Я искал здесь и во всем Интернете, и нашел много кода, который был полезен для получения идей. Тем не менее, я несколько раз стучал головой об этом, и я все еще очень новичок в программировании, всякая помощь будет принята с благодарностью!

Итак, на данный момент внутри класса Client у меня есть эти методы входа:

public void askName()
{
    // get the clients name
    boolean b = true;
    // loop in case they enter a null name - aint nobody got time for that
    while(b == true)
    {
        out.println("What is your name?");
        String name = null;
        try {
            name = in.readLine();
        } catch (IOException e) {
            System.out.println("Can't read name");
        }           
        out.println("What is your password?");
        String password = null;
        try {
            password = in.readLine();
        } catch (IOException e) {
            System.out.println("Can't read password");
        }           
        if(name != null && password != null)
        {
            if(Authenticate(name, password))
            {
                this.username = name;
                b = false;
                out.println("Welcome " + this.username);
            } else {
                out.println("Invalid username/password combination!");
            }   
        }
        else
        {
            out.println("Please enter a valid username and password. Your name must contain at least one letter");
        }   
    }
}

private boolean Authenticate(String name, String password) { // added by Alex 18/03/14
    // Method to check the entered username/password is valid against the database

    // No database class at this point

    //Database database = new Database(); 

    return database.Authenticate(name, password);

}

Мне удалось реализовать базу данных в классе "MyJDBC", и мне просто нужно выяснить, как использовать мой метод проверки подлинности для проверки деталей. Я использую PostgreSQL. Это текущий запрос, который я сделал для проверки учетных данных "SELECT password FROM userlogin WHERE username = '" + name + "'"

package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MyJDBC {
    public static void main(String args[]) {
        System.out.println("PostgreSQL JDBC Connection Testing");
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("Where is your PostgreSQL JDBC Driver? "
                    + "Include in your library path!");
            e.printStackTrace();
            return;
        }
        System.out.println("PostgreSQL JDBC Driver Registered!");
        Connection connection = null;
        Statement stmt = null;
        try {
            connection = DriverManager.getConnection(
"jdbc:postgresql://dbteach2.cs.bham.ac.uk:5432/user",
"username",
"password");
            stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery( "SELECT password FROM userlogin WHERE username ='"+name+"'");
            while (rs.next()) {
                String Username = rs.getString("Username");
                String Password = rs.getString("Password");
                int sid = rs.getInt("sid");
                System.out.println("Username = " + Username);
                System.out.println("Password = " + Password);
                System.out.println("sid = " + sid);
                System.out.println();
            }
            rs.close();
            stmt.close();
            connection.close();
        } catch (SQLException e) {
            System.out.println("Connection Failed! Check output console");
            e.printStackTrace();
            return;
        }
    }}

Я не прошу кого-либо сделать мой код, но некоторые советы о том, что я могу сделать/что я делаю неправильно, будут оценены. Если вы хотите увидеть остальную часть моего кода, чтобы попробовать, скажите об этом.

Теги:
database
jdbc
messenger

2 ответа

2

На практике вам явно не следует использовать четкие текстовые пароли, вы должны использовать их и солить. Затем примените тот же хэш и соль к введенному пароходу и сопоставьте их, как я опишу ниже. Довольно прямо.

Как вы просили узнать основной процесс, вот он:
Получите пароль для своего пользовательского userlogin, userlogin должен быть unique поэтому в ResultSet будет только один кортеж. Если для этого username пользователя нет строки, пользователь не существует → throw Exception.

Далее следует сопоставить полученный вами пароль с тем, который пользователь retrievedPw.equals(userEnteredPw) через retrievedPw.equals(userEnteredPw). Если он вернет true, зарегистрируйте пользователя, поскольку его учетные данные верны.

Если дело доходит до соления, я сам немного борется со словом назад, поэтому вы можете прочитать это расследование о солевом передовом опыте.

  • 0
    Я буду +1, если вы поставите сначала «соль и хэш» :-)
  • 0
    @JimGarrison Возможно ты прав. Я обновлю это.
0

Мои предложения:

  • добавить хешированный пароль в базу данных по соображениям безопасности
  • использовать подготовленные инструкции, чтобы избежать атак SQL-инъекций
  • добавить надлежащее закрытие ресурсов, чтобы избежать головной боли при производстве

Ещё вопросы

Сообщество Overcoder
Наверх
Меню