首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用JDBC (PostgreSQL)比较登录凭据与数据库

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

Stack Overflow用户
提问于 2014-03-20 15:01:15
回答 2查看 5.4K关注 0票数 1

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

我一直在这里和网上搜索,并发现了许多代码,这是有用的想法。然而,我已经把我的头撞在这一段时间,仍然是非常新的编程,任何帮助都会非常感谢!

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

代码语言:javascript
运行
复制
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。这是我为检查登录凭据“从用户登录中选择密码”所做的当前查询,其中username =‘+name+’‘“

代码语言:javascript
运行
复制
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;
        }
    }}

我不要求任何人做我的代码,但一些建议,我可以做什么/做错了什么,将不胜感激。如果你想看看我的其他代码来尝试它,请说出来。

EN

回答 2

Stack Overflow用户

发布于 2014-03-20 15:29:45

在实践中,您显然不应该使用明文密码,您应该哈希和盐分它们。然后将相同的散列和盐应用到输入的密码中,并匹配它们,就像我在下面所做的那样。挺直接的。

当您要求了解基本流程时,如下所示:

检索userlogin的密码,userlogin应该是unique,所以ResultSet中只有一个元组。如果没有检索到该username的行,用户就不存在->抛出一个Exception

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

如果说到盐渍的话,我自己之前也和这个词做过斗争,所以你可能想读This disucssion on salting best practices.

票数 2
EN

Stack Overflow用户

发布于 2014-03-21 09:10:32

我的建议:

  • 出于安全原因,在数据库中添加散列密码
  • 使用准备好的语句避免SQL注入攻击。
  • 适当关闭资源以避免生产中的麻烦
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22536960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档