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


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

     session->set_userdata('username')

Это сохранит сеанс - я полагаю - на некоторое время

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

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

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

Спасибо

Author: ahmed, 2010-10-21

6 answers

Если установлен флажок запомнить меня, вы устанавливаете файл 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 каждый раз, когда пользователь входит в систему. Таким образом, он останется в системе.

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

 57
Author: Mischa, 2010-10-21 14:57:22

Мне нужно было то же самое. Вы не можете выполнить это с помощью настроек CI, поэтому я решил переопределить метод setcookie класса сеанса CI (в 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
            );

}

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

 6
Author: Ferdy, 2010-11-02 10:42:54

Вы можете использовать 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);
     };
?>
 2
Author: San Bergam, 2014-04-17 03:37:23

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

  1. Включить крючки в"config.php "установка $config['enable_hooks'] = TRUE;

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

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

    $hook['post_controller_constructor'] = array(
        'class'     => 'Change_Config',
        'function'  => 'change_session_expiration',
        'filename'  => 'change_config.php',
        'filepath'  => 'hooks'
    );
    
  4. В вашей папке "крючки" создайте файл с именем "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;
            }
        }
    }
    
 2
Author: Danilo Colasso, 2016-02-11 17:43:18
$this->session->sess_expiration = '14400';    // expires in 4 hours
$this->session->set_userdata($data);          // set session
 1
Author: Jacopo, 2014-02-05 08:52:26

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

 0
Author: Herr, 2010-10-21 08:46:29