Привет, ребята! Я хочу ограничить вход в систему четырьмя (4) в день.
Я работаю так
Нужно ли устанавливать попытки входа в userdata?
кто-нибудь там уже делал это?
контроллер
// database work
$data = $this->login_model->validate_login($this->input->post('username'), $this->input->post('password'));
модель
public function validate_login($username, $password) {
$this->load->helper('password');
$this->db->select('user_id, username, password, date_registered, active, login_attempts');
$this->db->from('users');
$this->db->where('username', $username);
$this->db->limit(1);
$query = $this->db->get();
if($query->num_rows() == 1) {
$row = $query->row();
if (hash_password($password) == $row->password) {
$array['user_id'] = $row->user_id;
$array['username'] = $row->username;
$array['date_registered'] = $row->date_registered;
$array['active'] = $row->active;
return $array;
}
}
// login attempts +1 because login failed
$this->_increase_login_attempts($username);
return (1 + (isset($row) ? $row->login_attempts : 0));
}
private function _increase_login_attempts($username) {
$this->db->set('login_attempts', 'login_attempts + 1', FALSE);
$this->db->where('username', $username);
$this->db->update('users');
if ($this->db->affected_rows() == 1) {
return true;
}
return false;
}
Вы должны хранить количество попыток (или записи, если хотите) в своей базе данных (например, MySQL или Redis), а не в данных сеанса.
Потому что сеанс может быть очищен, если пользователь очистил куки браузера.
Создайте другую таблицу с userId (FK, int), tryCount (int), lastAttempt (datetime).
Логика:
Проверьте, существует ли идентификатор пользователя в таблице попыток.
а. Если да, проверьте, если (currentTime — lastAttempt)> 24h) сброс попытки попытки, еще попытки ++.
б. Если нет, создайте запись, установите попытку = 1.