codeigniter - userdata - Destruir una sesión específica en Code Igniter
redir codeigniter (3)
Nota para el personal: esta pregunta y las respuestas asociadas están bloqueadas para evitar la discusión fuera del tema que rodea un evento actual relacionado con la pregunta en cuestión. Las preguntas sobre este evento se pueden encontrar en nuestro meta sitio . ¡Gracias!
Quiero poder registrar a los usuarios de mi aplicación integrada en Code Igniter.
Sé cómo finalizar una sesión local activa:
$this->session->sess_destroy();
Pero, ¿cómo puedo destruir una sesión que se inició en otra computadora y, por lo tanto, desconectar a un usuario de su sesión?
Guardo una identificación única asociada con su cuenta en los datos de la sesión, así que puedo verla en la tabla de la sesión en la base de datos, pero se almacena junto con los datos de la otra sesión en una columna llamada datos_usuario, cuyo contenido se parece mucho a esta:
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 la identificación del usuario.
Entonces, ¿hay alguna manera de seleccionar de alguna manera la fila en la tabla de sesión basada en la identificación del usuario, y luego eliminar la fila y destruir la sesión? ¿O hay otra manera de hacer esto por completo?
Crea 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 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 es su ID de usuario. Eso borra las sesiones anteriores y significa que solo existe una a la vez.
Existe la función de destruir algunos elementos / sesiones que desee
$this->session->unset_userdata(''session_name'')
Y para permitir que un usuario inicie sesión en una computadora a la vez o en un navegador a la vez, puede leer más aquí.
Uno de los problemas con los datos serializados es que no hay una forma legítima de consultarlo. Deberá obtener todos los usuarios en la sesión (podría ser mucho ) y descomprimir los datos, verificar el valor y luego eliminar la fila en la tabla de la sesión, 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 de su sitio, conectado o no, tiene una sesión que debería ser seleccionada, y recuerde: un usuario podría tener más de una sesión, por lo que tendría que pasar por cada una de ellas.
Otro enfoque podría ser agregar una columna personalizada a la tabla de la sesión con la identificación del usuario (o un hash de la identificación). Algo que puede consultar para encontrar la sesión del usuario rápidamente. Luego, cuando agregue el user_id a la sesión, llene esta columna, y cuando necesite eliminar la sesión por user_id, puede hacerlo de manera rápida y eficiente.