当前位置: 首页 > 知识库问答 >
问题:

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

姚浩歌
2023-03-14

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

我一直在这里和网上搜索,找到了很多有用的代码来获取想法。然而,我已经有一段时间一直在思考这个问题,我对编程还是很陌生,如果有任何帮助,我将不胜感激!

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

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中选择密码,其中用户名='“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;
        }
    }}

我并没有要求任何人执行我的代码,但如果能提供一些关于我可以做什么/我做错了什么的建议,我将不胜感激。如果你想看到我的代码的其余部分来尝试它,请这样说。

共有2个答案

戚学
2023-03-14

我的建议:

  • 出于安全原因在数据库中添加散列密码
  • 使用预准备语句避免SQL注入攻击
  • 添加适当的资源关闭以避免生产头痛
姜乐家
2023-03-14

在实践中,您显然不应该使用明文密码,您应该对其进行哈希和盐处理。然后将相同的哈希和salt应用于输入的passwort,并像下面描述的那样进行匹配。非常直截了当。

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

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

如果说到腌制,我自己不久前也在为这个词而挣扎,所以你可能想读一读关于腌制最佳实践的讨论。

 类似资料:
  • 问题内容: 我有一个脚本化的管道,可以使用该功能请求用户的密码,并将其与用户保存的凭据密码短语进行比较。如果用户输入是一种类型,则可以使用。但是,当我将输入类型更改为(因此用户输入时在屏幕上看不到该输入类型)时,它将失败并显示断言错误。 我确保输入与凭证文件中的密码匹配的密码。 我正在将Jenkins 2.83与最新的Credentials插件和Credentials绑定插件一起使用。 脚本: 我

  • 问题内容: 我有以下存储过程,没有编写完整的存储过程,但其中一些是: 我想知道何时我将@course转换为VARCHAR类型,而数据库中的我是INT类型-比较如何进行? 问题答案: 在SQL Server中,两种不同类型之间的比较是这样进行的: 首先,根据数据类型优先级的规则比较这两种类型的优先级: 优先级较低的数据类型将转换为优先级较高的数据类型 接下来,将优先级较低的类型强制转换为优先级较高的

  • 本文向大家介绍如何使用JDBC程序连接到PostgreSQL数据库?,包括了如何使用JDBC程序连接到PostgreSQL数据库?的使用技巧和注意事项,需要的朋友参考一下 PostgreSQL是一个由全球志愿者团队开发的开源关系数据库管理系统(DBMS)。PostgreSQL不受任何公司或其他私人实体的控制,并且源代码是免费提供的。 PostgreSQL可在所有主要操作系统上运行,包括Linux,

  • 我正在开发一个聊天应用程序,在该应用程序中,我必须从edittext设置登录Id密码凭据,根据响应,我必须进入更多屏幕。 当我静态使用凭据时,我从网络服务获得响应 但当我从EditText获取凭证时,它现在给了我适当的回应。

  • 问题内容: 我想使用python urllib2来模拟登录操作,我使用Fiddler捕获数据包,并获得登录操作只是ajax请求,并且用户名和密码作为json数据发送,但是我不知道如何使用urllib2发送JSON数据,帮助… 问题答案: 假设您使用HTTP POST发送带有用户名和密码的简单json对象。

  • 我们有内部工具,可以通过SSO Azure AD访问。我很想知道这个Azure AD如何根据windows凭据进行验证。例如,假设1)我们有内部DEV env。https::/auth/v1/session/profile,因此当我调用此实例时,它会重定向到https://login.microsoftonline.com//oauth2/authorize?response_type=code