Я пытаюсь создать простую систему входа с java, используя базу данных mySQl.
Я сохранил идентификатор пользователя и пароль в таблице базы данных. Я придумал способ входа в систему, который, кажется, работает хорошо, но я не уверен, что это правильный способ сделать это, поскольку я не мог найти ни одного онлайн-источника для систем входа в систему.
Мои шаги:
Я хорошо знаю, что хранение паролей в текстовом виде является большой дырой в безопасности, но на данный момент я просто пытаюсь узнать, как использовать данные из БД в моей программе 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 как параметр в свой запрос и получить пароль и баланс из таблицы DB, тогда вы должны сравнить пароль с введенным пользователем паролем.
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();
}
"Если бы я мог видеть дальше, то только потому, что я стоял на плечах гигантов".
Вот гигант:
Вы найдете что-то вроде:
Optional<User> r = userRepo.findByName(name);
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
if (passwordEncoder.matches(password, user.getPassword())) {
// ...
}
WHERE
для выбора пользователей с определенным именем пользователя, таким образом цикл while будет выполняться не более 1 раза (учитывая, что у вас нет дубликатов). Вы также можете фильтровать по имени пользователя и паролю, таким образом у вас будет один запрос, который проверяет, существует ли пользователь и совпадает ли пароль.