Codeigniter 3 останавливает несколько входов в систему, используя базу данных ci_sessions - PullRequest
1 голос
/ 18 июня 2020

Я работаю с этим приложением, созданным в codeigniter 3, и пытаюсь предотвратить одновременный вход в систему. Поскольку по умолчанию в CI нет чего-то подобного, я решил попробовать написать несколько функций для этого. Я не сделал слишком много, но это мой общий план, и мне хотелось бы узнать мнения и мысли о моем подходе. Я думаю, что мне нужно создать столбец user_id в моей таблице ci_session, а затем, когда пользователь входит в систему, используйте этот user_id, чтобы проверить все user_id в таблице сеансов, а затем удалить эти сеансы, а затем добавить это user_id в новую сессию. Вот что я сделал до сих пор:

Шаг 1

Создайте столбец user_id в ci_sessions

Я так не думаю Столбец должен быть ключом к таблице пользователей, поскольку мы просто сравниваем его с пользователем, который в данный момент входит в систему. Вот как таблица выглядит теперь после обновления.

id | ip_address | timestamp | data | user_id

Шаг 2

Итак, теперь, когда это сделано, следующим шагом будет добавление идентификатора пользователя к сеансу при входе в систему. Таким образом, в потоке входа в систему, если вход успешен, мы можем сравнить этот идентификатор пользователя со всеми текущие сеансы идентификатора пользователя, и если есть какие-либо с тем же идентификатором пользователя, мы удаляем сеанс.

Шаг 3

Сохранение текущего идентификатора пользователя в сеансе

Думаю, это лучшие шаги, если только кто-нибудь не знает лучшего способа обработки одновременных входов в систему с помощью codeigniter.

1 Ответ

1 голос
/ 19 июня 2020

То, как я это сделал, было абсолютно правильно. К счастью для меня, все изменения контроллера, которые мне нужно было внести, были все в папке, и внести корректировки было очень просто.

Вот как выглядит процесс проверки входа:

    public function validate_login($from = "") {
        $email = $this->input->post('email');
        $password = $this->input->post('password');
        $credential = array('email' => $email, 'password' => sha1($password), 'status' => 1);

        // Checking login credential for admin
        $query = $this->db->get_where('users', $credential);

        if ($query->num_rows() > 0) {
            $row = $query->row();
            $this->session->set_userdata('user_id', $row->id);
            $this->session->set_userdata('role_id', $row->role_id);
            $this->session->set_userdata('role', get_user_role('user_role', $row->id));
            $this->session->set_userdata('name', $row->first_name.' '.$row->last_name);
            $this->delete_session_user_id();
            $this->session->set_flashdata('flash_message', get_phrase('welcome').' '.$row->first_name.' '.$row->last_name);
            if ($row->role_id == 1) {
                $this->session->set_userdata('admin_login', '1');
                redirect(site_url('admin/dashboard'), 'refresh');
            }else if($row->role_id == 2){
                $this->session->set_userdata('user_login', '1');
                $this->set_session_user_id();
                redirect(site_url('home/my_courses'), 'refresh');
            }
        }else {
            $this->session->set_flashdata('error_message',get_phrase('invalid_login_credentials'));
            redirect(site_url('home/login'), 'refresh');
        }
    }

И это дополнительные функции, которые я добавил, чтобы завершить это

    public function delete_session_user_id(){
        $session_user_id = $this->session->userdata('user_id');
        $this->db->where('user_id',$session_user_id);
        $this->db->delete('ci_sessions');
    }

    public function set_session_user_id() {
        $session_user_id = $this->session->userdata('user_id');
        $this->db->set('user_id',$session_user_id);
        $this->db->where('id', session_id());
        $this->db->update('ci_sessions');
    }

В целом все оказалось намного проще, чем я думал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...