Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JDBC(PostgreSQL)将登录凭据与数据库进行比较_Java_Database_Postgresql_Jdbc_Messenger - Fatal编程技术网

Java 如何使用JDBC(PostgreSQL)将登录凭据与数据库进行比较

Java 如何使用JDBC(PostgreSQL)将登录凭据与数据库进行比较,java,database,postgresql,jdbc,messenger,Java,Database,Postgresql,Jdbc,Messenger,所以我尝试在Eclipse中制作一个简单的聊天信使。目前,如何将用户登录详细信息与存储在数据库表中的详细信息进行比较让我感到困惑。我有一个'askName()'方法,它接受用户名和密码,这需要使用我的'authenticate'方法来检查数据库中登录表中存储的详细信息 我一直在这里和网上搜索,找到了很多有用的代码来获取想法。然而,我一直在打击我的头对这一点有一段时间,仍然是非常新的编程,任何帮助将不胜感激 因此,目前在客户端类中,我有以下登录方法: public void askName() {

所以我尝试在Eclipse中制作一个简单的聊天信使。目前,如何将用户登录详细信息与存储在数据库表中的详细信息进行比较让我感到困惑。我有一个'askName()'方法,它接受用户名和密码,这需要使用我的'authenticate'方法来检查数据库中登录表中存储的详细信息

我一直在这里和网上搜索,找到了很多有用的代码来获取想法。然而,我一直在打击我的头对这一点有一段时间,仍然是非常新的编程,任何帮助将不胜感激

因此,目前在客户端类中,我有以下登录方法:

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”类中实现了数据库,只需要弄清楚如何使用“authenticate”方法来检查细节。我正在使用PostgreSQL。这是我为检查登录凭据“从userlogin中选择密码,其中username='“+name+””而进行的当前查询


我并没有要求任何人做我的代码,但是对于我能做什么/我做错了什么的一些建议,我将不胜感激。如果您想查看我的代码的其余部分来试用它,请这样说。

实际上,您显然不应该使用明文密码,您应该对它们进行哈希和盐析。然后对输入的passwort应用相同的hash和salt,并像下面描述的那样匹配它们。非常直截了当

正如您要求了解的基本流程,这里是:
为您的
用户登录
检索密码,
用户登录
应该是
唯一的
,因此
结果集中只有一个元组
。如果没有为该
用户名
检索到任何行,则用户不存在-->抛出
异常

接下来是将检索到的密码与用户通过
retrievedPw.equals(userEnteredPw)
输入的密码进行匹配。如果返回true,请在用户的凭据正确时登录

如果说到盐渍,我自己也在为这个词苦苦挣扎,所以你可能想看看我的建议:

  • 出于安全原因,在数据库中添加哈希密码
  • 使用准备好的语句避免SQL注入攻击
  • 添加适当的资源关闭,以避免对生产造成头痛

首先,密码应始终使用salt散列(例如使用PBKDF2或bcrypt),而不是以明文形式存储。这是一个很好的观点,谢谢。目前,我只想让身份验证工作起来,所以我只是使用表中存储的用户详细信息。一旦这是工作,我将致力于改善细节,如发送和存储密码安全。你应该设计和开发从一开始就考虑到安全性,而不是黑客在事后。好吧,我的坏。我是编程新手,这是我的第一个实际项目-我会把它牢记在心!还有谁想创建一个帐户并加入kimbleoffice聊天-小Bobby Tables(好吧,这只是OP代码中那个狡猾的SQL注入错误的一个提示:D)如果你先把“salt和hash”放在第一位,我将+1:-)
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;
        }
    }}