Установить время истечения сеанса в ручном режиме CodeIgniter
Как я могу установить время истечения сеанса динамически в codeigniter?
Например, если пользователь входит в систему и имеет роль admin
, время истечения срока действия должно быть больше, чем если пользователь регистрируется, у кого нет роли admin
.
Спасибо.
Ответы
Ответ 1
Вы можете обновить время истечения сеанса, увеличив эту переменную в файле конфигурации:
$config['sess_expiration'] = 'somevalue'.
Установите $config['sess_expiration'] = 0
, если вы хотите, чтобы он никогда не истекал.
Здесь хорошая дискуссия на форумах CI:
Динамическая настройка конфигурации при истечении срока действия сеанса не работает
Ответ 2
$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
Ответ 3
Ни одно из этих решений не выполняет это динамически или не требует добавления другой переменной в сеанс. Решение, которое я разработал для CI 3.0.4, заключается в расширении Session.php.
-
Создать файл application/libraries/Session/MY_Session.php
-
Поместите в файл следующее и измените для своей логики установку переменной $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);
}
}
Ответ 4
Вы можете справиться с этим с помощью настраиваемого контроллера. Когда пользователь входит в систему, установите переменную сеанса со временем входа в систему. Создайте пользовательский контроллер, который содержит функцию в конструкторе, чтобы проверить, не является ли пользователь пользователем admin и истекает ли время ожидания. Если он есть, вызовите $this- > session- > destroy(); Теперь сделайте все свои контроллеры расширением этого контроллера вместо базового контроллера CI.
Ответ 5
Я пробовал код @Chris Muench, но ниже строки приводит к ошибке
$CI->db->from('table_name');
Вызов функции-члена из() в null в пути к номеру строки My_Session.php. Моя версия CI - 3.1.5. Как я могу это исправить?
заранее спасибо
Ответ 6
Сессия истекает через 10 секунд
$config['sess_expiration']= 10;
Сессия не истекает
$config['sess_expiration']= 0;
Ответ 7
используйте что-то вроде этого:
$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']
));
Ответ 8
В codeigniter перейдите в application/config.php и найдите приведенную ниже конфигурацию.
$config['sess_expiration'] = 14400; //in seconds
Ответ 9
В вашей функции входа в систему сразу после проверки учетных данных пользователя вы можете проверить, является ли пользователь администратором, и соответственно установить разные сеансы. Что-то в этом направлении
<?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;
Ответ 10
Вы можете решить проблему сеанса, заменив это:
$config['sess_use_database'] = TRUE;
$config['sess_encrypt_cookie'] = TRUE;
с этим:
$config['sess_use_database'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;