58 votes

Destruction d'une session spécifique dans Code Igniter

Je veux être capable de déconnecter les utilisateurs de mon application construite dans 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, de sorte que 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.

Ainsi, existe-t-il un moyen de sélectionner la ligne dans la table de session en fonction de l'identifiant de l'utilisateur, puis de supprimer la ligne et de détruire la session. Ou existe-t-il un autre moyen de le faire entièrement ?

38voto

Stevo Points 896

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, récupérez l'identifiant de votre processus de connexion et, avant d'ajouter les informations relatives aux données utilisateur à la session, faites ce qui 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));

$identity est votre identifiant. Cela efface toutes les sessions précédentes et signifie qu'il n'en existe qu'une seule à la fois.

0 votes

Ne perdriez-vous pas le userid lorsque l'identifiant de session est régénéré ? Je pensais que c'était le problème dont nous avions parlé dans les commentaires ?

1 votes

Non. Lorsque l'utilisateur se connecte à partir de la deuxième machine, mais avant que l'utilisateur ne soit authentifié, une nouvelle session est créée, et à ce moment-là, il y a deux enregistrements dans la base de données. Avec le code ci-dessus, l'ancien enregistrement de session est détruit et le nouveau est simplement mis à jour avec les informations de session. J'ai modifié la réponse pour qu'elle soit un peu plus claire.

1 votes

Je veux dire quand la même session régénère son propre identifiant . "...the session class will check to see if valid session data exists in the user's session cookie...If a session does exist, its information will be updated ... With each update, the session_id will be regenerated." Est-ce que je néglige quelque chose ?

5voto

Hieu Van Mach Points 559

Il existe une fonction permettant de détruire certains éléments/session que vous souhaitez.

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

Et pour permettre à un utilisateur de se connecter à un seul ordinateur à la fois ou à un seul navigateur à la fois, vous pouvez en savoir plus ici.

Autoriser une seule session à la fois

4voto

Wesley Murch Points 48959

L'un des problèmes des 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 (il peut s'agir d'une session lot ) et déballe les données, vérifie la valeur, puis supprime la ligne dans la table de session, détruisant effectivement 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éconseillerais probablement cela. Chaque utilisateur de votre site, qu'il soit connecté ou non, a une session qu'il faut parcourir, et n'oubliez pas qu'un utilisateur peut avoir plusieurs sessions et qu'il faut donc les parcourir toutes.

Une autre approche pourrait consister à ajouter une colonne personnalisée à la table de session avec l'identifiant de l'utilisateur (ou un hash de l'identifiant). Il s'agirait d'une colonne que vous pourriez interroger pour trouver rapidement la session de l'utilisateur. Ensuite, lorsque vous ajoutez l'ID utilisateur à la session, remplissez cette colonne, et lorsque vous devez supprimer la session par ID utilisateur, cela peut être fait rapidement et efficacement.

0 votes

Je déconseille également cette approche. Votre deuxième suggestion est plus réaliste.

0 votes

Bien qu'il soit plus facile d'ajouter cette fonction, ce n'est pas forcément la meilleure solution si vous avez une table de session énorme.

4 votes

Je vous déconseillerais de travailler sur ce projet, car il mène à une impasse sans issue, mais je pense que ce conseil arrive un peu trop tard. Bonne continuation mon frère !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X