Установить время истечения сеанса вручную-CodeIgniter

Как я могу установить время истечения сеанса динамически в codeigniter?

Например, если пользователь входит в систему и играет роль adminвремя истечения должно быть больше, чем если пользователь входит в систему, у которого нет admin роль.

Благодарю.

12 ответов

Вы можете обновить время истечения сеанса, увеличив эту переменную в файле конфигурации:

$config['sess_expiration'] = 'somevalue'.

Задавать $config['sess_expiration'] = 0, если вы хотите, чтобы он никогда не истек.

Вот хорошее обсуждение на форумах CI:

Динамически заданная конфигурация по истечении сеанса не работает

$data = array(
'username' => $this->input->post('username'),
'ADMIN_is_logged_in' => true
);

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

Ни одно из этих решений не решает эту проблему динамически и не требует добавления другой переменной в сеанс. Решение, которое я придумал для CI 3.0.4, заключается в расширении Session.php.

  1. Создать файл application/libraries/Session/MY_Session.php

  2. Поместите в файл следующее и измените для вашей логики установки $expiration переменная. В моем случае я извлекаю значение из базы данных. ПРИМЕЧАНИЕ. Если у вас разные значения срока годности для каждого типа пользователя; есть вероятность, что они могут получить мусор и неожиданно истечь из-за разных истечений в одном сеансе. В этом случае я НЕ рекомендую этот подход.

    <?php
    class MY_Session extends CI_Session 
    {
        public function __construct(array $params = array())
        {
            parent::__construct($params);
        }
    
        /**
         * Configuration
         *
         * Handle input parameters and configuration defaults
         *
         * @param   array   &$params    Input parameters
         * @return  void
         */
        protected function _configure(&$params)
        {
            $CI =& get_instance();
            $phppos_session_expiration = NULL;
    
            $CI->db->from('app_config');
            $CI->db->where("key", "phppos_session_expiration");
            $row = $CI->db->get()->row_array();
            if (!empty($row))
            {
                if (is_numeric($row['value']))
                {
                    $phppos_session_expiration = (int)$row['value'];
                }
            }
    
            $expiration = $phppos_session_expiration !== NULL ? $phppos_session_expiration : config_item('sess_expiration');
    
            if (isset($params['cookie_lifetime']))
            {
                $params['cookie_lifetime'] = (int) $params['cookie_lifetime'];
            }
            else
            {
                $params['cookie_lifetime'] = ( ! isset($expiration) && config_item('sess_expire_on_close'))
                    ? 0 : (int) $expiration;
            }
    
            isset($params['cookie_name']) OR $params['cookie_name'] = config_item('sess_cookie_name');
            if (empty($params['cookie_name']))
            {
                $params['cookie_name'] = ini_get('session.name');
            }
            else
            {
                ini_set('session.name', $params['cookie_name']);
            }
    
            isset($params['cookie_path']) OR $params['cookie_path'] = config_item('cookie_path');
            isset($params['cookie_domain']) OR $params['cookie_domain'] = config_item('cookie_domain');
            isset($params['cookie_secure']) OR $params['cookie_secure'] = (bool) config_item('cookie_secure');
    
            session_set_cookie_params(
                $params['cookie_lifetime'],
                $params['cookie_path'],
                $params['cookie_domain'],
                $params['cookie_secure'],
                TRUE // HttpOnly; Yes, this is intentional and not configurable for security reasons
            );
    
            if (empty($expiration))
            {
                $params['expiration'] = (int) ini_get('session.gc_maxlifetime');
            }
            else
            {
                $params['expiration'] = (int) $expiration;
                ini_set('session.gc_maxlifetime', $expiration);
            }
    
            $params['match_ip'] = (bool) (isset($params['match_ip']) ? $params['match_ip'] : config_item('sess_match_ip'));
    
            isset($params['save_path']) OR $params['save_path'] = config_item('sess_save_path');
    
            $this->_config = $params;
    
            // Security is king
            ini_set('session.use_trans_sid', 0);
            ini_set('session.use_strict_mode', 1);
            ini_set('session.use_cookies', 1);
            ini_set('session.use_only_cookies', 1);
            ini_set('session.hash_function', 1);
            ini_set('session.hash_bits_per_character', 4);
        }
    
    }
    

В Codeigniter 4 Перейдите в файл App=>Config=>App.php. Найдите переменную $sessionExpiration. Значение по умолчанию для этой переменной — 7200. Измените ее на значение, которое вы хотите, чтобы ваша сессия была активной. Полная конфигурация для сеанса приведена ниже:

       public $sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler';
public $sessionCookieName = 'ci_session';
public $sessionExpiration = 7200;
public $sessionSavePath = WRITEPATH . 'session';
public $sessionMatchIP = false;
public $sessionTimeToUpdate = 300;
public $sessionRegenerateDestroy = false;

Вы можете справиться с этим с помощью специального контроллера. Когда пользователь входит в систему, установите переменную сеанса со временем входа в систему. Создайте пользовательский контроллер, содержащий функцию в конструкторе, чтобы проверить, не является ли пользователь администратором и истекло ли время ожидания. Если это так, вызовите $this->session->destroy(); Теперь заставьте все ваши контроллеры расширять этот контроллер вместо базового контроллера CI.

Сессия истечет через 10 секунд

$config['sess_expiration']= 10;

Сессия не истечет

$config['sess_expiration']= 0;

В Codeigniter 4 я делаю по-другому.

Установите время истечения сеанса на максимальное значение (например, месяц для всех), затем в вашем контроллере или библиотеках, если пользователь не является администратором, проверьте последнее активное время, если время больше, чем вам нужно, уничтожьте сеанс и потребуйте войти в систему .

Используйте что-то вроде этого:

$user_type = $this->input->post('user_type');
if ($user_type == 'admin')
{
    //set session to non-expiring
    $this->session->sess_expiration = '32140800'; //~ one year
    $this->session->sess_expire_on_close = 'false';
}
else
{
    //set session expire time, after that user should login again
    $this->session->sess_expiration = '1800'; //30 Minutes
    $this->session->sess_expire_on_close = 'true';
}

//set session and go to Dashboard or Admin Page
$this->session->set_userdata(array(
    'id' => $result[0]['id'],
    'username' => $result[0]['username']
));

На codeigniter перейдите в application /config.php и найдите приведенную ниже конфигурацию.

$config['sess_expiration'] = 14400; //in seconds

В функции входа в систему сразу после проверки учетных данных пользователя вы можете проверить, является ли пользователь администратором, и соответственно установить различные сеансы. Нечто подобное

<?php
/*
 *Assuming user is successfully veriefied and you've verified id user is admin*/

if($isAdmin==true){
$this->session->sess_expiration = 14400; // 4 Hours

}else{

// For ordinary users
$this->session->sess_expiration = 1800; // 30 minutes 
   

}
$this->session->sess_expire_on_close = FALSE;

Я думаю, что лучше всего использовать сеанс temp_data, и вы всегда можете изменить его динамически, и это не зависит от вашего 'sessions_expiration' в файле конфигурации:

      $this->session->set_tempdata('admin_session', true, 72000);
$this->session->set_tempdata('user_session', true, 14400);

где вы проверяете состояние входа администратора или пользователя, например ADMIN_is_logged_in? проверьте оставшееся время жизни tempdata:

       if($this->session->tempdata('admin_session')){
//do something }
else{ 
//session timeout and is time to destroy all sessions
session_destroy();
}

Вы можете решить проблему сессии, заменив это:

$config['sess_use_database'] = TRUE;
$config['sess_encrypt_cookie'] = TRUE;

с этим:

$config['sess_use_database'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
Другие вопросы по тегам