Как создать флажок "запомнить меня", используя библиотеку сеансов Codeigniter? - PullRequest
23 голосов
/ 21 октября 2010

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

     session->set_userdata('username')

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

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

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

Спасибо

Ответы [ 7 ]

61 голосов
/ 21 октября 2010

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

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

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

6 голосов
/ 02 ноября 2010

Мне нужно то же самое. Вы не можете сделать это с помощью настроек 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
            );

}

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

2 голосов
/ 11 февраля 2016

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

  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. В папке "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;
            }
        }
    }
    
2 голосов
/ 17 апреля 2014

Вы можете использовать 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);
     };
?>
1 голос
/ 30 ноября 2018

Вы можете просто поставить это

if ($remember) {

  $new_expiration = (60*60*24*365);

  $this->config->set_item('sess_expiration', $new_expiration);

  $this->config->set_item('sess_expire_on_close', FALSE);

  $this->session->sess_expiration = $new_expiration;

  $this->session->sess_expire_on_close = FALSE;

}
1 голос
/ 05 февраля 2014
$this->session->sess_expiration = '14400';    // expires in 4 hours
$this->session->set_userdata($data);          // set session
0 голосов
/ 21 октября 2010

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

...