Подтвердить что ты не робот

Как создать флажок "Запомнить меня" с помощью библиотеки сеансов Codeigniter?

в Codeigniter. Я создаю систему аутентификации для своего веб-сайта и для достижения этого использую библиотеку сеансов

     session->set_userdata('username')

это спасет сессию - я верю - в течение некоторого времени

Я хочу предоставить флажок "запомнить меня" в форме входа, чтобы пользователь мог сохранить сеанс навсегда - не смог найти способ сохранить сеанс навсегда!?

Примечание: $sess_expiration не будет работать, потому что он устанавливает дату истечения срока действия для всех пользователей и что я хочу сделать, это установить дату истечения срока действия на основе его предпочтений

возможно? и как это сделать?

Спасибо

4b9b3361

Ответ 1

Если флажок "Запомнить меня" установлен, вы устанавливаете cookie в пользовательской системе со случайной строкой. Например:.

$cookie = array(
    'name'   => 'remember_me_token',
    'value'  => 'Random string',
    'expire' => '1209600',  // Two weeks
    'domain' => '.your_domain.com',
    'path'   => '/'
);

set_cookie($cookie);

Вы также сохраняете эту случайную строку в таблице users, например. в столбце remember_me_token.

Теперь, когда пользователь (который еще не вошел в систему) пытается получить доступ к странице, для которой требуется аутентификация:

  • вы проверяете, есть ли файл cookie по имени remember_me токена в его системе
  • если он там, вы проверяете базу данных, если есть запись с тем же значением
  • если это так, вы воссоздаете этот сеанс пользователя (это значит, что они вошли в систему)
  • показать страницу, которую они посетили.

Если одно из указанных выше требований не выполняется, вы перенаправляете их на страницу входа.

По соображениям безопасности вы можете возобновить случайный remember_me_token каждый раз, когда пользователь входит в систему. Вы также можете обновлять дату истечения срока действия файла cookie каждый раз, когда пользователь входит в систему. Таким образом, он останется в системе.

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

Ответ 2

Мне нужно то же самое. Вы не можете выполнить это, используя настройки CI, поэтому я решил переопределить метод setcookie класса CI Session (в MY_Session):

function _set_cookie($cookie_data = NULL)
{
    if (is_null($cookie_data))
    {
        $cookie_data = $this->userdata;
    }

    // Serialize the userdata for the cookie
    $cookie_data = $this->_serialize($cookie_data);

    if ($this->sess_encrypt_cookie == TRUE)
    {
        $cookie_data = $this->CI->encrypt->encode($cookie_data);
    }
    else
    {
        // if encryption is not used, we provide an md5 hash to prevent userside tampering
        $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
    }

    setcookie(
                $this->sess_cookie_name,
                $cookie_data,
                $this->userdata('rememberme') == true ? $this->sess_expiration + time() : 0,
                $this->cookie_path,
                $this->cookie_domain,
                0
            );

}

Конечно, вам нужно установить флаг memmeme в вашем сеансе, основываясь на выборе пользователя.

Ответ 3

Я использовал крючки для этого

  • Включить перехваты в настройке "config.php" $config['enable_hooks'] = TRUE;

  • В контроллере входа в систему сохраните значение флажка в сеансе

    $this->session->set_userdata('remember_me', $this->input->post('remember_me'));
    
  • В вашем файле "hooks.php" добавьте этот

    $hook['post_controller_constructor'] = array(
        'class'     => 'Change_Config',
        'function'  => 'change_session_expiration',
        'filename'  => 'change_config.php',
        'filepath'  => 'hooks'
    );
    
  • В вашей папке создайте файл с именем "change_config.php" и вставьте этот

    <?php
    class Change_Config {
        public function change_session_expiration() {
            $ci = & get_instance();
    
            $remember = $ci->session->userdata('remember_me');
    
            if($remember && $ci->session->sess_expire_on_close) {
                $new_expiration = (60*60*24*365); //A year milliseconds
    
                $ci->config->set_item('sess_expiration', $new_expiration);
                $ci->config->set_item('sess_expire_on_close', FALSE);
    
                $ci->session->sess_expiration = $new_expiration;
                $ci->session->sess_expire_on_close = FALSE;
            }
        }
    }
    

Ответ 4

$this->session->sess_expiration = '14400';    // expires in 4 hours
$this->session->set_userdata($data);          // set session

Ответ 5

Вы можете использовать isset, чтобы проверить, имеет ли файл cookie значение, и если файл cookie будет удален, он вернет отрицательный результат. Если это отрицательно, вы можете снова установить cookie... конечно, это будет похоже на "обновление" файла cookie, поэтому, если пользователь не выйдет по истечении срока действия, они будут забыты. (Установите очень большое время до истечения срока действия!)

Например:

<?php
     if (isset($_COOKIE['autologin'])) {   //Checks for cookie
         echo "Welcome back!... Logging you in.";
     }else{  //Sets a cookie
         echo "Please sign in";
         $expiretime=time()+60*60*24*365; //set expire time to a year
         setcookie("autologin", "What is here is not important.", $expiretime);
     };
?>

Ответ 6

Вы можете установить sess_expiration в 0, а затем установить пользовательскую переменную в сеанс вроде, remember_me = 1. Проверьте это значение и уничтожьте сеанс, если потребуется через некоторое время. Это будет рабочий стол.