【问题标题】:Is there any other better way to get and compare database credentials with java?还有其他更好的方法来获取数据库凭据并将其与 java 进行比较吗?
【发布时间】:2019-01-14 06:17:44
【问题描述】:

我正在尝试使用 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();
    }
}

【问题讨论】:

  • 使用我创建的 fetch() 方法遍历表并查找此特定 ID - 这可能是一项繁重的操作,尤其是如果您有成千上万的用户( = 数千次迭代)。相反,使用WHERE 子句选择具有特定用户名的用户,这样while 循环将最多执行1 次(假设您没有重复)。您还可以按用户名 密码进行过滤,这样您将有一个查询来检查用户是否存在并且密码是否匹配。
  • 感谢您的建议@BackSlash 我使用我的结果集执行了 SELECT WHERE 查询并使用 if 语句检查我的结果集是否为真然后得到密码。

标签: java mysql database login passwords


【解决方案1】:

您可以直接将 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();    
}

【讨论】:

  • 欢迎 @Jix Sas 它对你有用吗?我的意思是您是否发现这就是您要寻找的答案?
【解决方案2】:

“如果我能看得更远,那只是因为我站在了巨人的肩膀上。”

这是巨人:

https://spring.io

你会发现类似的东西:

Optional<User> r = userRepo.findByName(name);
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
if (passwordEncoder.matches(password, user.getPassword())) {
   // ...
}

【讨论】:

  • 现在我只是想学习如何在我的 java 程序中使用数据库中的数据 - “使用 spring”在这里不是一个好建议 IMO,尤其是如果 OP 是初学者。
  • @BackSlash 是对的,但感谢您提出我将来可能会使用 spring 的建议。
猜你喜欢
  • 2018-05-20
  • 2017-07-20
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多