web-dev-qa-db-fra.com

Définir l'heure d'expiration de session manuellement-CodeIgniter

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.

20
Siregar

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

16
AlphaMale
$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
9
KDawg

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.

  1. Créer un fichier application/libraries/Session/MY_Session.php

  2. 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);
        }
    
    }
    
2
Chris Muench

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.

0
solidau