Détruire une session spécifique dans Code Igniter

Note du Personnel: cette question et les réponses associées sont verrouillées pour empêcher la discussion hors sujet entourant un événement en cours qui est lié à la question en cours. Questions sur cet événement peut être trouvé sur notre méta site. Merci!!!!

Je veux pouvoir déconnecter les utilisateurs de mon application intégrée à Code Igniter.

Je sais comment mettre fin à une session locale:

$this->session->sess_destroy();

Mais comment puis-je détruire une session cela a été démarré sur un autre ordinateur et donc 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 de 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 à ceci:

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;}

189034 est l'identifiant de l'utilisateur.

Alors, existe-t-il un moyen de sélectionner la ligne dans la table de session en fonction de l'id de l'utilisateur, et puis supprimez la ligne et détruisez la session. Ou y a-t-il un autre moyen de le faire entièrement?

43
demandé sur Community 2012-03-05 12:35:10

3 réponses

Crée 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 userdata à la session, faites:

//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 identifiant. Cela efface toutes les sessions précédentes et signifie qu'une seule existe à la fois.

30
répondu Stevo 2012-03-05 20:41:15

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

Autoriser une seule session à la fois

4
répondu Hieu Van Mach 2017-05-23 12:25:26

L'un des problèmes avec les données sérialisées est qu'il n'y a pas de moyen légitime de les interroger. Vous devrez obtenir tous les utilisateurs de la session (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 sur votre site, connecté ou non, a une session qui devrait être sélectionnée, et rappelez-vous: un utilisateur pourrait avoir plus d'une session donc, vous devez faire un cycle à travers chacun.

Une autre approche pourrait consister à 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 la session de l'utilisateur rapidement. 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.

3
répondu Wesley Murch 2012-03-05 08:59:51