Java 如何使用JDBC(PostgreSQL)将登录凭据与数据库进行比较
所以我尝试在Eclipse中制作一个简单的聊天信使。目前,如何将用户登录详细信息与存储在数据库表中的详细信息进行比较让我感到困惑。我有一个'askName()'方法,它接受用户名和密码,这需要使用我的'authenticate'方法来检查数据库中登录表中存储的详细信息 我一直在这里和网上搜索,找到了很多有用的代码来获取想法。然而,我一直在打击我的头对这一点有一段时间,仍然是非常新的编程,任何帮助将不胜感激 因此,目前在客户端类中,我有以下登录方法:Java 如何使用JDBC(PostgreSQL)将登录凭据与数据库进行比较,java,database,postgresql,jdbc,messenger,Java,Database,Postgresql,Jdbc,Messenger,所以我尝试在Eclipse中制作一个简单的聊天信使。目前,如何将用户登录详细信息与存储在数据库表中的详细信息进行比较让我感到困惑。我有一个'askName()'方法,它接受用户名和密码,这需要使用我的'authenticate'方法来检查数据库中登录表中存储的详细信息 我一直在这里和网上搜索,找到了很多有用的代码来获取想法。然而,我一直在打击我的头对这一点有一段时间,仍然是非常新的编程,任何帮助将不胜感激 因此,目前在客户端类中,我有以下登录方法: public void 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中选择密码,其中username='“+name+””而进行的当前查询
我并没有要求任何人做我的代码,但是对于我能做什么/我做错了什么的一些建议,我将不胜感激。如果您想查看我的代码的其余部分来试用它,请这样说。实际上,您显然不应该使用明文密码,您应该对它们进行哈希和盐析。然后对输入的passwort应用相同的hash和salt,并像下面描述的那样匹配它们。非常直截了当 正如您要求了解的基本流程,这里是:
为您的
用户登录
检索密码,用户登录
应该是唯一的
,因此结果集中只有一个元组
。如果没有为该用户名
检索到任何行,则用户不存在-->抛出异常
接下来是将检索到的密码与用户通过retrievedPw.equals(userEnteredPw)
输入的密码进行匹配。如果返回true,请在用户的凭据正确时登录
如果说到盐渍,我自己也在为这个词苦苦挣扎,所以你可能想看看我的建议:
- 出于安全原因,在数据库中添加哈希密码
- 使用准备好的语句避免SQL注入攻击
- 添加适当的资源关闭,以避免对生产造成头痛
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;
}
}}