Как я могу динамически установить время истечения сеанса в codeigniter?
Например, если пользователь входит в систему и имеет роль admin, время истечения должно быть больше, чем если пользователь входит в систему, ктоне имеет роли admin.
admin
Спасибо.
Вы можете обновить время истечения сеанса, увеличив эту переменную в файле конфигурации:
$config['sess_expiration'] = 'somevalue'.
Установите $config['sess_expiration'] = 0, если хотите, чтобы оно никогда не истекло.
$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.
Создать файл application/libraries/Session/MY_Session.php
application/libraries/Session/MY_Session.php
Поместите в файл следующее и измените для вашей логики установки переменной $expiration. В моем случае я извлекаю значение из базы данных. ПРИМЕЧАНИЕ. Если у вас разные значения срока годности для каждого типа пользователя; есть вероятность, что они могут получить мусор и неожиданно истечь из-за разных истечений в одном сеансе. В этом случае я НЕ рекомендую такой подход.
$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); } }
В функции входа в систему сразу после проверки учетных данных пользователя вы можете проверить, является ли пользователь администратором, и соответственно установить различные сеансы. Что-то в этом роде
<?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;
На codeigniter перейдите в application / config.php и найдите приведенную ниже конфигурацию.
$config['sess_expiration'] = 14400; //in seconds
используйте что-то вроде этого:
$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'] ));
Вы можете решить проблему сеанса, заменив это:
$config['sess_use_database'] = TRUE; $config['sess_encrypt_cookie'] = TRUE;
следующим:
$config['sess_use_database'] = FALSE; $config['sess_encrypt_cookie'] = FALSE;
Вы можете справиться с этим с помощью специального контроллера.Когда пользователь входит в систему, установите переменную сеанса со временем входа в систему.Создайте пользовательский контроллер, содержащий функцию в конструкторе, чтобы проверить, не является ли пользователь администратором и истекло ли время ожидания.Если это так, вызовите $ this-> session-> destroy ();Теперь заставьте все ваши контроллеры расширять этот контроллер вместо базового контроллера CI.