java - 还有其他更好的方法来获取和比较数据库凭证与java吗?

标签 java mysql database authentication passwords

我正在尝试使用 mySQl 数据库使用 java 创建一个简单的登录系统。

我已将用户 ID 和密码存储在数据库表中。 我想出了一种登录方法,似乎效果很好,但我不确定这是否是正确的方法,因为我找不到任何登录系统的在线资源。

我的步骤是:

  1. 获取用户的输入(用户 ID 和密码)。
  2. 使用我创建的 fetch() 方法来迭代表并查找此特定 ID。
  3. 如果找到,则从表中获取密码和余额并将其存储在变量中。
  4. 最后将我之前从数据库获取并存储在变量中的密码与用户输入的密码进行比较。

我很清楚以纯文本形式存储密码是一个很大的安全漏洞,但现在我只是想学习如何在我的java程序中使用数据库中的数据

这是我的代码:

public class firstjava extends Database {

    public static int UID = 0;
    public static String password;
    public static int BAL;
    public static String upassword;

    static void fetch(int userid) throws SQLException {
        String query = "SELECT * FROM Persons";
        Statement st = con.createStatement();

        ResultSet rs = st.executeQuery(query);

        while (rs.next()) {
            int ID = rs.getInt("pid");
            if (ID == UID) {
                password = rs.getString("password");
                BAL = rs.getInt("balance");
            }

        }
        if (upassword.equals(password)) {
            System.out.println("you are now logged in");
        } else {
            System.out.println("incorrect password");
        }
        st.close();
    }

    public static void menu() throws IOException, SQLException {
        Scanner atm = new Scanner(System.in);
        System.out.println("enter your account number");
        UID = atm.nextInt();
        System.out.println("enter your account password");
        upassword = atm.next();
        fetch(UID);
    }

    public static void main(String[] args) throws IOException, SQLException {
        Database db = new Database();
        try {
            db.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        menu();
        db.close();
    }
}

最佳答案

您可以直接将 userId 作为参数传递给查询,并从数据库表中获取密码和余额,然后您应该将密码与用户输入的密码进行比较。

static void fetch(int userid) throws SQLException
{
    PreparedStatement ps = null;
    ResultSet rs = null;

    String query = "SELECT * FROM Persons where pid = ?";
    PreparedStatement ps = con.prepareStatement(query);
    ps.setInt(1,userid);
    rs = ps.executeQuery(); //instantiate rs with executed query

    while(rs.next()) {
        password = rs.getString("password");
        BAL = rs.getInt("balance");
    }   
    if(upassword.equals(password)) {
        System.out.println("you are now logged in");
    } else {
        System.out.println("incorrect password");
    }
    rs.close();
    ps.close();    
}

关于java - 还有其他更好的方法来获取和比较数据库凭证与java吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51722011/

相关文章:

java - Java 程序将 EBCDIC 转换为 ASCII 的示例 EBCDIC 文件

mysql select语句?

java - 在 java 中监视文件夹中新文件的最佳 API

java - Spring4 MVC单元测试无法编译

php - Doctrine 仅返回空缓存的结果

mysql - 仅对一列和特定状态的子集使用 datediff

PHP PDO 自定义类返回一个对象而不是它应该返回的对象

mysql - 在同一台服务器上导入两个具有相同架构(数据库名称)的不同 mysql 转储文件

php - 缓存zend framework 2 php代码执行结果

java - 实现 ArrayLists 到 Table 模型