Destruir una sesión específica en Code Igniter


Nota del Personal: Esta pregunta y las respuestas asociadas están bloqueadas para evitar la discusión fuera del tema que rodea un evento actual que está relacionado con la pregunta en cuestión. Preguntas sobre este evento se puede encontrar en nuestro sitio meta . ¡Gracias!

Quiero poder cerrar la sesión de los usuarios de mi aplicación incorporada en el encendedor de código.

Sé cómo terminar una sesión local activa:

$this->session->sess_destroy();

Pero, ¿cómo puedo destruir una sesión que se inició en otro equipo y por lo tanto cerrar la sesión de un usuario?

Almaceno un id único asociado a su cuenta en los datos de la sesión, por lo que puedo verlo en la tabla de la sesión en la base de datos, pero se almacena junto con los otros datos de la sesión en una columna llamada user_data, cuyo contenido se ve algo como esto:

a:4:
{s:9:"user_data";s:0:"";s:6:"userid";s:6:"189034";s:9:"logged_in";b:1;s:5:"token";i:1767727789;}

Donde 189034 es el id del usuario.

Entonces, ¿hay una manera de seleccionar de alguna manera la fila en la tabla de sesiones basada en el id del usuario, y luego eliminar la fila y destruir la sesión. ¿O hay otra manera de hacer esto por completo?

Author: Community, 2012-03-05

3 answers

Cree una nueva columna en la tabla ci_session.

ALTER TABLE `yourdatabase`.`ci_sessions` 
ADD COLUMN `userid` VARCHAR(45) NULL  AFTER `user_data` ;

Luego, en su función de inicio de sesión, obtenga el id de su proceso de inicio de sesión y antes de agregar la información de datos de usuario a la sesión, haga lo siguiente:

//delete any existing sessions with the current userid session.
// Note - a new session has already been generated but doesn't have a value
// in the userid column, so won't get deleted.
$this->db->delete('ci_sessions',array('userid' => $identity));    

//get the current session and update it with the userid value.
$session_id = $this->session->userdata('session_id');
$this->db->where('session_id', $session_id);
$this->db->update('ci_sessions', array('userid' => $identity));

Donde identity identity es tu userid. Eso borra cualquier sesión anterior y significa que solo existe una a la vez.

 30
Author: Stevo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 20:41:15

Existe la función para destruir algunos elementos / sesión que desee

$this->session->unset_userdata('session_name')

Y para permitir que un usuario inicie sesión en un equipo a la vez o en un navegador a la vez, puede leer más aquí

Permitir una sesión solo a la vez

 4
Author: Hieu Van Mach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:26

Uno de los problemas con los datos serializados es que no hay una forma legítima de consultarlos. Tendrá que obtener todos los usuarios de la sesión (podría ser un lote ) y descomprimir los datos, verificar el valor y luego eliminar la fila en la tabla de sesiones, destruyendo efectivamente esa sesión.

foreach ($this->db->get('sessions')->result() as $session)
{
    $data = unserialize($session->user_data);

    if ( ! isset($data['user_id'])) continue;

    if ($data['user_id'] === $id_to_delete)
    {
        // delete the row
            $this->db->where('session_id', $session->session_id)
                ->delete('sessions');
    }
}

Probablemente desalentaría esto. Cada usuario en su sitio, conectado o no, tiene una sesión que tendría que ser elegido a través de, y recuerde: un usuario posiblemente podría tener más de una sesión así que tendrías que pasar por cada uno.

Otro enfoque podría ser agregar una columna personalizada a la tabla de sesiones con el id de usuario (o un hash del id). Algo que puede consultar para encontrar la sesión del usuario rápidamente. Luego, cuando agregue el user_id a la sesión, rellene esta columna y cuando necesite eliminar la sesión por user_id, se puede hacer de manera rápida y eficiente.

 3
Author: Wesley Murch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 08:59:51