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

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

session->set_userdata('username') 

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

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

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

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

благодаря

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

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

Мне нужно то же самое. Вы не можете выполнить это, используя настройки 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 ); } 

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

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

  1. Включить $config['enable_hooks'] = TRUE; настройке «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; } } } 
 $this->session->sess_expiration = '14400'; // expires in 4 hours $this->session->set_userdata($data); // set session 

Вы можете использовать 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); }; ?> 

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