Я создаю базовую базу данных регистрации/логина имени пользователя/пароля, и мне интересно, правильный ли мой подход. Я не удовлетворен тем, что код работает, я хочу, чтобы он был чистым и эффективным.Доступ к базе данных пользователей из нескольких классов
Пользователи могут получить доступ к странице входа в Интернет, ввести учетные данные и войти в систему. У меня есть класс базы данных, который создает учетные записи и проверяет правильность введенных учетных данных.
Итак, класс базы данных:
public class Database {
private Connection connection = null;
private PreparedStatement preparedStatement = null;
private ResultSet resultSet = null;
// Method for registering a new account. Credentials are added into the database.
public void registerAccount(String username, String password, String ipAddress) {
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
connection = DriverManager
.getConnection("jdbc:derby:C:\\DB;create=true;upgrade=true");
String query = "INSERT INTO Users (username, password, ip_address) VALUES" + "(?,?,?)";
preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
preparedStatement.setString(3, ipAddress);
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
private void close() {
try {
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
например: Когда пользователь нажимает отправить войти в систему, метод внутри класса базы данных называется:
// Checks if credetials are correct.
public boolean checkLogin(String username, String password) {
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
connection = DriverManager
.getConnection("jdbc:derby:C:\\DB;create=true;upgrade=true");
String query = "SELECT username, password from Users WHERE username = ? AND password = ?";
preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
String user = resultSet.getString("username");
String pass = resultSet.getString("password");
if (username.equalsIgnoreCase(user)) {
if (password.equals(pass)) {
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
return false;
}
У меня также есть несколько других методы в классе Database, чтобы проверить, не является ли имя пользователя при регистрации, или если учетная запись уже зарегистрирована на определенном IP-адресе и т. д. Является ли эта хорошая практика или существуют более эффективные способы ее достижения? Спасибо!
Ну очень хорошо для меня. Хотя, поскольку это веб-система, я предлагаю вам взглянуть на такие рамки безопасности, как [Spring Security] (http://projects.spring.io/spring-security/) и делегировать такую ответственность в уже хорошо документированную структуру , В вашем коде я бы предложил только некоторую технику хэширования, чтобы вы хэш-пароль пользователя и вставляли его, когда вы проверите хэш-строку, отправленную пользователем, и сравните ее, как вы делаете. Таким образом, даже вы не могли видеть пароль пользователя. –