Я делаю приложение на PHP с каркасом CodeIgniter.
Мне удалось создать страницу регистрации, которая позволяет пользователям вводить свой адрес электронной почты и пароль. Я использую password_hash(password, PASSWORD_DEFAULT)
функцию PHP для хранения паролей пользователей в базе данных. Я убедился, что столбец имеет длину VARCHAR длиной 255.
В моей модели пользователя у меня есть следующие функции:
User_model:
public function insert_user($emailAddress, $password, $firstName, $lastName){
$data = array(
'email' => $emailAddress,
'password' => password_hash($password, PASSWORD_DEFAULT),
'firstName' => $firstName,
'lastName' => $lastName
);
if(! $this->emailExists($emailAddress)){
$this->db->insert('users', $data);
return true;
} else {
return false;
}
}
public function emailExists($emailAddress){
$query = $this->db->get_where('users', array('email' => $emailAddress));
if($query->num_rows() == 0){
return false;
}
return true;
}
//Only use this function if you know that the email is already stored in db
public function getPassword($emailAddress){
$query = $this->db->get_where('users', array('email' => $emailAddress));
$row = $query->row();
$password = $row->password;
return $password;
}
Это мой контроллер для обработки логинов
Авторизоваться:
class Login extends CI_Controller {
public function index(){
$this->load->helper(array('form', 'url'));
$this->load->model('User_model');
$this->load->library('form_validation');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('email', 'Email', 'valid_email|required');
if ($this->form_validation->run() == FALSE){
$this->load->view('login');
} else {
$email = $this->input->post('email');
$password = $this->input->post('password');
if($this->User_model->emailExists($email)){
$storedPassword = $this->User_model->getPassword($email);
if(password_verify($password, $storedPassword)){
echo 'passwords match';
} else {
echo 'passwords dont match';
}
} else {
echo 'email doesnt exist';
}
}
}
}
Соответствующее представление:
авторизоваться
<html>
<head>
<title>Login</title>
</head>
<body>
<?php echo validation_errors(); ?>
<?php echo form_open('Login'); ?>
<h5>Email Address</h5>
<input type="text" name="email" value="<?php echo set_value('email');?>" size="50" />
<h5>Password</h5>
<input type="text" name="password" value="<?php echo set_value('password');?>" size="50" />
<div><input type="submit" value="Submit" /></div>
</form>
</body>
</html>
Когда я пытаюсь войти в систему с ранее зарегистрированным адресом электронной почты и комбинацией паролей, это всегда означает, что пароли не совпадают.
Я понятия не имею, почему это не будет работать. Могу ли я вставить или получить неверный пароль из базы данных, который может изменить хэш?
Если $storedPassword
же, как вы ожидаете, - хеш, который соответствует тому, который $storedPassword
в поле пароля для пользователя, как определено их электронной почтой, - тогда это должно означать, что пароль, который пользователь предоставляет, не соответствует таковому в базе данных; так как это единственный логический вариант.
Я бы начал заново и создал нового пользователя с новым паролем и посмотрел, будет ли он работать после этого. Пожалуйста, имейте в виду, что поле password
в базе данных должно быть равно или выше 255 символов (varchar (255)) (возможно, ваше поле недостаточно велико, поэтому только часть хеша хранится - объяснит вашу проблему).
Поэтому рекомендуется сохранять результат в столбце базы данных, который может расширяться до 60 символов (255 символов будут хорошим выбором).
$storedPassword = $this->User_model->getPassword($email);
- не должна ли переменная электронной почты быть здесь для пароля? Конечно, похоже на это для меня.var_dump($storedPassword);
?