web-dev-qa-db-ja.com

セッションの有効期限を手動で設定する-CodeIgniter

Codeigniterでセッションの有効期限を動的に設定するにはどうすればよいですか?

たとえば、ユーザーがログインしてadminの役割を持っている場合、admin役割を持たないユーザーがログインする場合よりも有効期限を長くする必要があります。

ありがとう。

22
Siregar

設定ファイルの次の変数を増やすことで、セッションの有効期限を更新できます。

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

セットする $config['sess_expiration'] = 0、有効期限が切れないようにする場合。

CIフォーラムでの良い議論は次のとおりです。

セッションの期限切れ時に動的に設定が機能しない

19
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
10
KDawg

これらのソリューションはいずれも、これを動的に行うことにも、セッションに別の変数を追加する必要もありません。 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);
        }
    
    }
    
2
Chris Muench

カスタムコントローラーでこれを処理できます。ユーザーがログインするときに、ログイン時のセッション変数を設定します。コンストラクターに関数を含むカスタムコントローラーを作成して、ユーザーが管理ユーザーではないかどうか、タイムアウトが期限切れになっているかどうかを確認します。持っている場合は、$ this-> session-> destroy()を呼び出します。ここで、すべてのコントローラーがCIベースコントローラーではなくそのコントローラーを拡張するようにします。

0
solidau