因此,我试图在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”中实现了数据库,只需要弄清楚如何使用我的“身份验证”方法来检查细节。我正在使用PostgreSQL。这是我为检查登录凭据“从用户登录中选择密码”所做的当前查询,其中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;
}
}}我不要求任何人做我的代码,但一些建议,我可以做什么/做错了什么,将不胜感激。如果你想看看我的其他代码来尝试它,请说出来。
发布于 2014-03-20 15:29:45
在实践中,您显然不应该使用明文密码,您应该哈希和盐分它们。然后将相同的散列和盐应用到输入的密码中,并匹配它们,就像我在下面所做的那样。挺直接的。
当您要求了解基本流程时,如下所示:
检索userlogin的密码,userlogin应该是unique,所以ResultSet中只有一个元组。如果没有检索到该username的行,用户就不存在->抛出一个Exception。
接下来是将检索到的密码与用户通过retrievedPw.equals(userEnteredPw)输入的密码匹配。如果返回true,请在用户的凭据正确时登录。
如果说到盐渍的话,我自己之前也和这个词做过斗争,所以你可能想读This disucssion on salting best practices.。
发布于 2014-03-21 09:10:32
我的建议:
https://stackoverflow.com/questions/22536960
复制相似问题