Comment définir le délai d'expiration de la session de manière dynamique dans codeigniter?
Par exemple, si un utilisateur se connecte et a le rôle admin
, le délai d'expiration doit être plus long que s'il se connecte sans avoir le rôle admin
.
Merci.
Vous pouvez mettre à jour votre heure d'expiration de session en augmentant cette variable dans le fichier de configuration:
$config['sess_expiration'] = 'somevalue'.
Définissez $config['sess_expiration'] = 0
si vous voulez qu'il n'expire jamais.
Voici une bonne discussion sur les forums de CI:
La configuration définie dynamiquement à l'expiration de la session ne fonctionne pas
$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
Aucune de ces solutions ne le fait de manière dynamique ou nécessite l'ajout d'une autre variable à la session. La solution que j'ai proposée pour CI 3.0.4 consiste à étendre le fichier Session.php.
Créer un fichier application/libraries/Session/MY_Session.php
Mettez ce qui suit dans le fichier et modifiez pour votre logique de définition de la variable $expiration
. Dans mon cas, je tire la valeur d'une base de données. REMARQUE: Si vous avez différentes valeurs d'expiration par type d'utilisateur; il est possible que les ordures soient collectées et expirent de manière inattendue en raison d'expirations différentes avec la même session. Dans ce cas, je ne recommande pas cette approche.
<?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);
}
}
Vous pouvez gérer cela avec un contrôleur personnalisé. Lorsqu'un utilisateur se connecte, définissez une variable de session avec l'heure de la connexion. Créez un contrôleur personnalisé contenant une fonction dans le constructeur pour vérifier si l'utilisateur n'est pas administrateur et si le délai a expiré. Si c'est le cas, appelez $ this-> session-> destroy (); Maintenant, faites en sorte que tous vos contrôleurs étendent ce contrôleur au lieu du contrôleur de base CI.