set_userdata - session_destroy codeigniter
Establecer el tiempo de caducidad de la sesiĆ³n manualmente-CodeIgniter (8)
En codeigniter, vaya a applications / config.php y encuentre la configuración a continuación.
$config[''sess_expiration''] = 14400; //in seconds
¿Cómo puedo configurar dinámicamente el tiempo de expiración de la sesión en codeigniter?
Por ejemplo, si un usuario inicia sesión y tiene el rol de admin
, el tiempo de caducidad debe ser más largo que si un usuario inicia sesión quien no tiene un rol de admin
.
Gracias.
En su funcionalidad de inicio de sesión, una vez verificadas las credenciales de usuario, puede verificar si el usuario es administrador y configurar diferentes sesiones de manera correspondiente. Algo en este sentido
<?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;
Ninguna de estas soluciones aborda esto de forma dinámica o requiere que se agregue otra variable a la sesión. La solución que se me ocurrió para CI 3.0.4 es extender Session.php.
Crear
application/libraries/Session/MY_Session.php
archivoapplication/libraries/Session/MY_Session.php
Coloque lo siguiente en el archivo y modifíquelo para su lógica de configuración de la variable de
$expiration
. En mi caso estoy sacando el valor de una base de datos. NOTA: Si tiene diferentes valores de caducidad por tipo de usuario; existe la posibilidad de que la basura se recolecte y caduque inesperadamente debido a diferentes vencimientos en la misma sesión. En este caso NO recomiendo este enfoque.<?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); } }
Puede actualizar el tiempo de caducidad de su sesión aumentando esta variable en el archivo de configuración:
$config[''sess_expiration''] = ''somevalue''.
Establezca $config[''sess_expiration''] = 0
, si desea que nunca caduque.
Aquí hay una buena discusión en los foros de CI:
La configuración de configuración dinámica en la sesión caduca no funciona
Puedes manejar esto con un controlador personalizado. Cuando un usuario inicia sesión, establezca una variable de sesión con el tiempo de inicio de sesión. Cree un controlador personalizado que contenga una función en el constructor para verificar si el usuario no es un usuario administrador y si el tiempo de espera ha caducado. Si es así, llame a $ this-> session-> destroy (); Ahora, haga que todos sus controladores extiendan ese controlador en lugar del controlador base de CI.
Puedes resolver el problema de la sesión reemplazando esto:
$config[''sess_use_database''] = TRUE;
$config[''sess_encrypt_cookie''] = TRUE;
con este:
$config[''sess_use_database''] = FALSE;
$config[''sess_encrypt_cookie''] = FALSE;
usa algo como esto:
$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'']
));
$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