в 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
.
Теперь, когда пользователь (который еще не вошел в систему) пытается получить доступ к странице, требующей аутентификации:
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 в своем сеансе, основываясь на выборе пользователя.
Я использовал крючки для этого
Включить $config['enable_hooks'] = TRUE;
настройке «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' );
В папке «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. Проверьте это значение и уничтожьте сеанс, если потребуется через некоторое время. Это будет рабочий стол.