手动设置会话过期时间-CodeIgniter

Posted

技术标签:

【中文标题】手动设置会话过期时间-CodeIgniter【英文标题】:Set Session Expiration Time Manually-CodeIgniter 【发布时间】:2011-10-23 18:20:29 【问题描述】:

如何在 codeigniter 中动态设置会话过期时间?

例如,如果用户登录并具有admin 角色,则到期时间应该比不具有admin 角色的用户登录时长。

谢谢。

【问题讨论】:

【参考方案1】:

在 Codeigniter 4 中 转到文件 App=>Config=>App.php 找到 var $sessionExpiration 此 var 的默认值为 7200 将其更改为您希望会话处于活动状态的值。 会话的完整配置如下:

 public $sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler';
public $sessionCookieName = 'ci_session';
public $sessionExpiration = 7200;
public $sessionSavePath = WRITEPATH . 'session';
public $sessionMatchIP = false;
public $sessionTimeToUpdate = 300;
public $sessionRegenerateDestroy = false;

【讨论】:

以后有什么办法改吗?假设针对不同的用户,不同的时间【参考方案2】:

我认为最好的选择是使用会话 temp_data 并且始终可以动态更改,并且不依赖于配置文件中的“sess_expiration”:

$this->session->set_tempdata('admin_session', true, 72000);
$this->session->set_tempdata('user_session', true, 14400);

您在哪里检查管理员或用户登录状态,例如“ADMIN_is_logged_in?” 通过以下方式检查剩余的“临时数据”生命周期:

 if($this->session->tempdata('admin_session'))
//do something 
else 
//session timeout and is time to destroy all sessions
session_destroy();

【讨论】:

【参考方案3】:

会话将在 10 秒后到期

$config['sess_expiration']= 10;

会话不会过期

$config['sess_expiration']= 0;

【讨论】:

【参考方案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;

【讨论】:

不,在会话过期时间已经启动后更改它不会也不会起作用,我今天已经测试过了。【参考方案5】:

这些解决方案都没有动态解决此问题或需要将另一个变量添加到会话中。我为 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);
        
    
    
    

【讨论】:

【参考方案6】:

你可以通过在配置文件中增加这个变量来更新你的会话过期时间:

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

设置$config['sess_expiration'] = 0,如果您希望它永不过期。

这是 CI 论坛上的一个很好的讨论:

Dynamically set configuration on session expire doesn’t work

【讨论】:

人们一直对此表示支持,但我认为通过阅读描述,这不是 OP 所要求的。他说“手动”,这将通过这个答案(配置中的一个常量值)来完成,但如果你读到他实际上试图做的事情,他的意思是“动态地”基于登录的用户角色。所以设置值配置文件无济于事,因为无论用户角色如何,它都是相同的值。 是的,我同意。在弄清楚这一步之后,他最终会想要动态地设置它来完成他真正想要的。所以这就是为什么我之前的回答真的会帮助他的事业。赞成那个有远见的人:)。 @Juventus 18,是的..这就是我的意思 我发现设置 sess_expiration 并不能阻止会话过期,并且我的会话数据存储在数据库中。 我已对原始帖子进行了编辑,以更清楚提问者的要求。【参考方案7】:

在 codeigniter 中转到 applications/config.php 并找到以下配置。

$config['sess_expiration'] = 14400; //in seconds

【讨论】:

他在问如何动态地做到这一点,而不是手动。他可能已经知道这些config.php 设置。【参考方案8】:

使用这样的东西:

$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']
));

【讨论】:

把这个文件放在哪里? 不,在会话过期时间已经启动后更改它不会也不会起作用,我今天已经测试过了。 它在 4 年前就开始工作了:D 我会测试,我会再次重新发布答案【参考方案9】:

你可以通过替换这个来解决会话问题:

$config['sess_use_database'] = TRUE;
$config['sess_encrypt_cookie'] = TRUE;

用这个:

$config['sess_use_database'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;

【讨论】:

【参考方案10】:
$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

【讨论】:

如何将 '14400' 计算为 4 小时? @JuliverGalleto,60 秒 * 60 分钟 * 4 小时 = 14400。 不,在会话过期时间已经启动后更改它不会也不会起作用,我今天已经测试过了。【参考方案11】:

您可以使用自定义控制器来处理这个问题。当用户登录时,使用登录时间设置会话变量。在构造函数中创建包含函数的自定义控制器,以检查用户是否不是管理员用户以及超时是否已过期。如果有,调用 $this->session->destroy();现在,让您的所有控制器扩展该控制器而不是 CI 基本控制器。

【讨论】:

当代码到达自定义控制器时会话已经开始,所以它不会工作。可能需要扩展 Session 文件类。 @giovannipds 您需要开始一个会话来决定是否销毁它,对吗?无法决定空/未知数据...

以上是关于手动设置会话过期时间-CodeIgniter的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 会话已过期 - 更新数据库

如何向用户显示会话过期消息(CodeIgniter 框架)?

带有 Codeigniter 会话到期时间的帮助

Codeigniter v3.0 Flashdata 会话在 PHP 7.4 和 XAMPP 8.0 中未过期

Codeigniter 3 - 会话库

将cookie设置为在会话结束时过期?网