Нарушение процесса входа в систему, если вы уже вошли в систему с другим сеансом - PullRequest
1 голос
/ 20 июня 2020

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

<form action="<?php echo site_url('login/validate_login/user'); ?>" method="post">
  <div class="content-box">
      <div class="basic-group">
          <div class="form-group">
              <label for="login-email"><span class="input-field-icon"><i class="fas fa-envelope"></i></span> <?php echo get_phrase('email'); ?>:</label>
              <input type="email" class="form-control" name = "email" id="login-email" placeholder="<?php echo get_phrase('email'); ?>" value="" required>
          </div>
          <div class="form-group">
              <label for="login-password"><span class="input-field-icon"><i class="fas fa-lock"></i></span> <?php echo get_phrase('password'); ?>:</label>
              <input type="password" class="form-control" name = "password" placeholder="<?php echo get_phrase('password'); ?>" value="" required>
          </div>
      </div>
  </div>
  <div class="content-update-box">
      <button type="submit" class="btn"><?php echo get_phrase('login'); ?></button>
  </div>
    <!-- Modal -->
  <div class="modal fade" id="login" role="dialog">
    <div class="modal-dialog">
    
      <!-- Modal content-->
      <div class="modal-content">
        <div class="modal-header">                                
          <h4 class="modal-title">You are already logged in</h4>
        </div>
        <div class="modal-body">
          <p>You are currently logged in on a different session on the site. Please note that if you continue, the existing session will be terminated. Please change your password if you suspect that your account has been conpromised.</p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Cancel Login</button>
          <button type="submit" class="btn"><?php echo get_phrase('login'); ?></button>
        </div>
      </div>
      
    </div>
  </div>
  <div class="forgot-pass text-center">
      <span><?php echo get_phrase('or'); ?></span>
      <a href="javascript::" onclick="toggoleForm('forgot_password')"><?php echo get_phrase('forgot_password'); ?></a>
  </div>
  <div class="account-have text-center">
      <?php echo get_phrase('do_not_have_an_account'); ?>? <a href="javascript::" onclick="toggoleForm('registration')"><?php echo get_phrase('sign_up'); ?></a>
  </div>
</form>

Кнопка в данный момент переходит прямо к этой функции входа:

    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 get_user_id($user_email = "") {
        $this->db->select('id');
        $this->db->where('email', $user_email);
        $user_id=$this->db->get('users');
        return $user_id;
    }

Эта функция может получить идентификатор пользователя на основе предоставленного адреса электронной почты.

Затем я использую эту функцию, чтобы проверить, есть ли сеанс, и вернуть false if есть 0 результатов и true , если есть сеанс с этим идентификатором пользователя. Так что, если это ложь, они должны иметь возможность войти в систему, а модальное всплывающее окно не должно открываться, но если это правда, оно должно открыться.

    public function user_has_session($user_id=''){
        $this->db->where('user_id',$user_id);
        $this->db->from('ci_sessions');
        $total=$this->db->count_all_results();
        if($total<0) 
            return false;
        else
            return true;
    }

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

Спасибо

Вот моя предыдущая проблема, на которую я сам ответил

ОБНОВЛЕНИЕ Добавлено, чтобы прояснить мою проблему

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

1 Ответ

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

Вам необходимо реализовать вызов Ajax, который будет проверять, вошел ли пользователь в систему или нет. Если пользователь не вошел в систему, вы можете перейти к входу в систему, в противном случае вы откроете всплывающее окно, чтобы отобразить сообщение.

Здесь пользователь может выбрать, входить или нет, если пользователи выбирают вход, вы можете отменить привязку при отправке и пусть пользователь go вперед.

Я внес некоторые изменения в ваш файл HTML. Пожалуйста, проверьте ниже -

Ваш HTML шаблон

      <form action="<?php echo site_url('login/validate_login/user'); ?>" id="login-form" onSubmit="return checkUserSession();" method="post">
        <div class="content-box">
            <div class="basic-group">
                <div class="form-group">
                    <label for="login-email"><span class="input-field-icon"><i class="fas fa-envelope"></i></span> <?php echo get_phrase('email'); ?>:</label>
                    <input type="email" class="form-control" name = "email" id="login-email" placeholder="<?php echo get_phrase('email'); ?>" value="" required>
                </div>
                <div class="form-group">
                    <label for="login-password"><span class="input-field-icon"><i class="fas fa-lock"></i></span> <?php echo get_phrase('password'); ?>:</label>
                    <input type="password" class="form-control" name = "password" placeholder="<?php echo get_phrase('password'); ?>" value="" required>
                </div>
            </div>
        </div>
        <div class="content-update-box">
            <button type="submit" class="btn"><?php echo get_phrase('login'); ?></button>
        </div>
        <!-- Modal -->
        <div class="modal fade" id="login" role="dialog">
        <div class="modal-dialog">
        
            <!-- Modal content-->
            <div class="modal-content">
            <div class="modal-header">                                
                <h4 class="modal-title">You are already logged in</h4>
            </div>
            <div class="modal-body">
                <p>You are currently logged in on a different session on the site. Please note that if you continue, the existing session will be terminated. Please change your password if you suspect that your account has been conpromised.</p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel Login</button>
                <button type="button" id="modal-submit-button" class="btn"><?php echo get_phrase('login'); ?></button>
            </div>
            </div>
            
        </div>
        </div>
        <div class="forgot-pass text-center">
            <span><?php echo get_phrase('or'); ?></span>
            <a href="javascript::" onclick="toggoleForm('forgot_password')"><?php echo get_phrase('forgot_password'); ?></a>
        </div>
        <div class="account-have text-center">
            <?php echo get_phrase('do_not_have_an_account'); ?>? <a href="javascript::" onclick="toggoleForm('registration')"><?php echo get_phrase('sign_up'); ?></a>
        </div>
    </form>
    
    <script>
        /** Trigger function on form submit whether to check user logged in */
        function checkUserSession(){
            var email = $("#login-email").val();
            $.ajax({
                url: "<?php echo site_url('login/checkUserSession'); ?>",
                type: 'POST',
                data: { 'email': email},                               
                success: function(status){                 
                    if(status == true) { // User is already logged in somewhere, display the messege.
                        $("#login").modal();
                        return false;
                    } else { // User is not logged in, submit the form
                        return true;
                    }
                }
            });
        }
        
        /** Allow user to log in with exception */
        $("#modal-submit-button").on("click", function(){
            $("#login").modal('hide'); // hide the modal
            $("#login-form").attr("onSubmit", ""); // unbind the function
            $("#login-form").submit(); // submit login form
        })
    </script>

Контроллер -

   <?php

       /** Function to check user logged in or not */
        public function checkUserSession() {
            $user_email = $this->input->post('email');
            $userId = $this->get_user_id($user_email);
            $response = $this->user_has_session($userId);
            echo $response;
        }

        public function get_user_id($user_email = "") {
            $this->db->select('id');
            $this->db->where('email', $user_email);
            $user_id=$this->db->get('users');
            return $user_id;
        }

        public function user_has_session($user_id=''){
            $this->db->where('user_id',$user_id);
            $this->db->from('ci_sessions');
            $total=$this->db->count_all_results();
            if($total<0) 
                return false;
            else
                return true;
        }
    ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...