Note du personnel: Cette question et les réponses associées sont verrouillées pour empêcher la discussion hors sujet entourant n courant événement qui est lié à la question posée. Questions à propos de cet événementpeut être trouvé sur notre site méta . Merci!
Je veux pouvoir déconnecter les utilisateurs de mon application intégrée à Code Igniter.
Je sais comment terminer une session locale active:
$this->session->sess_destroy();
Mais comment puis-je détruire une session qui a été lancée sur un autre ordinateur et ainsi déconnecter un utilisateur de sa session?
Je stocke un identifiant unique associé à leur compte dans les données de session, donc je peux le voir dans la table de session dans la base de données, mais il est stocké avec les autres données de session dans une colonne appelée user_data, dont le contenu ressemble à quelque chose comme cette:
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;}
où 189034
est l'ID de l'utilisateur.
Donc, existe-t-il un moyen de sélectionner la ligne dans la table de session en fonction de l'ID de l'utilisateur, puis de supprimer la ligne et de détruire la session. Ou existe-t-il une autre façon de procéder entièrement?
Créez une nouvelle colonne dans la table ci_session.
ALTER TABLE `yourdatabase`.`ci_sessions`
ADD COLUMN `userid` VARCHAR(45) NULL AFTER `user_data` ;
Ensuite, dans votre fonction de connexion, obtenez l'ID de votre processus de connexion et avant d'ajouter les informations de données utilisateur à la session, procédez comme suit:
/* 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));
Où $identity
est votre ID utilisateur. Cela efface toutes les sessions précédentes et signifie qu'une seule existe à la fois.
Il y a la fonction pour détruire certains éléments/session que vous voulez
$this->session->unset_userdata('session_name')
Et pour permettre à un utilisateur de se connecter à un ordinateur à la fois ou à un navigateur à la fois, vous pouvez en savoir plus ici
L'un des problèmes avec les données sérialisées est qu'il n'y a aucun moyen légitime de les interroger. Vous devrez obtenir tous les utilisateurs dans la session (cela pourrait être un lot) et décompresser les données, vérifier la valeur, puis supprimer la ligne dans la table de session, détruisant efficacement cette session.
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');
}
}
Je découragerais probablement cela. Chaque utilisateur de votre site, connecté ou non, a une session qui devrait être sélectionnée, et rappelez-vous: un utilisateur peut éventuellement avoir plus d'une session, vous devez donc parcourir chacune d'elles.
Une autre approche pourrait être d'ajouter une colonne personnalisée à la table de session avec l'ID utilisateur (ou un hachage de l'ID). Quelque chose que vous pouvez interroger pour trouver rapidement la session de l'utilisateur. Ensuite, lorsque vous ajoutez le user_id à la session, remplissez cette colonne et lorsque vous devez supprimer la session par user_id, cela peut être fait rapidement et efficacement.