1
votes

Supprimer une session pour un utilisateur distant - Déconnexion à distance en PHP - Codeigniter

J'utilise la base de données pour enregistrer les sessions utilisateur dans codeigniter.

$config['sess_driver']          = 'database';  // select database driver
$config['sess_save_path']       = 'ci_sessions';  // name of the mysql table
$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_match_ip']        = TRUE;
$config['sess_time_to_update']  = 300;
$config['sess_regenerate_destroy'] = TRUE;

Config:

$sess_array = array('id' => $new_cus_id,
                    'cus_email' => $email);
$this->session->set_userdata('logged_in',$sess_array);

Dans la table de base de données, il y a un id, adresse_ip, horodatage, données (blob) . Comment puis-je trouver les données de session d'un utilisateur spécifique et les supprimer pour invalider la session en ligne.


2 commentaires

@ B001 ᛦ: l'identifiant de session est une chaîne de caractères aléatoire. Comment en récupérer l'identifiant?


Copie possible de Comment détruire un données de session de l'utilisateur à partir d'un panneau d'administration


3 Réponses :


-1
votes

Semblable à la définition des données utilisateur dans la session, vous pouvez la désactiver en utilisant la méthode suivante selon la documentation de codeigniter:

$sess_array = array('id' => $new_cus_id,
                'cus_email' => $email);

$this->session->unset_userdata($sess_array);


3 commentaires

Fonctionne-t-il avec un navigateur ou un ordinateur différent? Parce que je veux déconnecter l'utilisateur à distance.


Tout cela se fait côté serveur, donc tant que vous l'exécutez à distance et que vous fournissez correctement les paramètres $ new_cus_id et $ email de l'utilisateur que vous souhaitez déconnecter, ça devrait marcher.


OP veut supprimer la session pour un utilisateur aléatoire (probablement après la suppression de l'utilisateur), pas pour l'utilisateur actuellement connecté.



-2
votes

vous pouvez simplement définir des données de session personnalisées avec $ this-> session-> set_userdata ('my_custom_session_data', true) et chaque fois que vous voulez le vérifier, utilisez if ($ this- > session-> userdata ('my_custom_session_data') == true) . ou pour le supprimer $ this-> session-> unset_userdata ('my_custom_session_data') ou $ this-> session-> userdata ('my_custom_session_data', '')


0 commentaires

1
votes

Une astuce qui peut vous aider.

Vous pouvez trouver les sessions appartenant à un e-mail spécifique en faisant quelque chose comme ça sur le tableau des sessions

select id, ip_address, cast(data as char(1000)) datablob
from internal.ci_sessions
having datablob like '%email@domain.com%';

Vous pouvez rencontrer plusieurs entrées appartenant aux sessions précédentes le long de celle actuellement active.

une fois que vous les avez trouvées, supprimez simplement ces lignes et la session sera effectivement terminée et l'utilisateur sera obligé de se reconnecter

Attention: ce n'est pas quelque chose que vous devriez faire souvent. Jouer avec la table des sessions peut provoquer des effets indésirables si vous touchez quelque chose que vous ne devriez pas. De plus, si votre table de session s'est agrandie après plusieurs mois / années d'utilisation sans entretien périodique, la suppression d'une ou plusieurs lignes peut avoir un impact temporaire sur les performances si la table doit être réindexée. Ne dites pas que je ne vous ai pas prévenu :)

Si ce n'est pas quelque chose que vous devez faire en cas d'urgence et que vous pouvez prendre le temps de le coder, ma suggestion est ce que je fais habituellement (oui, suggestion biaisée, je sais :))

1.- ajoutez un champ "forcer la déconnexion" au tableau avec vos informations utilisateur.

Par défaut, ce champ est "N" ou quelque chose de similaire. Sur chaque page vue (je le fais sur la construction du contrôleur), interrogez la table de l'utilisateur pour l'indicateur. Si "N" est renvoyé, passez à ce que l'utilisateur veut.

2.- déconnectez l'utilisateur s'il y a un indicateur de déconnexion

Si l'indicateur renvoie "Y", détruisez la session de l'utilisateur et redirigez l'utilisateur vers votre page de connexion. Après cela (vous pouvez également le faire lors d'une connexion réussie), n'oubliez pas de réinitialiser l'indicateur sur N afin d'empêcher l'utilisateur d'entrer dans une boucle de déconnexion.

Cela ajoute une requête à chaque page vue, mais l'impact doit être négligeable


4 commentaires

Cela fonctionne. Mais vous avez raison, c'est une solution compliquée. Quelle est la bonne façon de mettre en œuvre cela? Je suis sûr qu'il devrait y avoir une meilleure solution.


Certainement, il existe de meilleures façons. Considérez cette solution simplement comme un moyen rapide et sale de déconnecter de force quelqu'un en cas d'urgence. La bonne façon serait de marquer l'utilisateur (dans votre tableau des utilisateurs, par exemple) comme déconnecté et dans la page suivante, si vous voyez que l'utilisateur est marqué, utilisez CI pour invalider la session et rediriger l'utilisateur vers votre journal -en page. Cela nécessitera un certain codage (pas beaucoup) et peut-être quelques modifications à votre table d'utilisateurs, mais c'est certainement une solution plus propre


et si l'utilisateur est supprimé? vous ne pouvez pas le signaler. vous n'avez donc pas d'autre choix que d'utiliser votre solution ci-dessus OU d'étendre le pilote de session avec une colonne supplémentaire user_id qui est mise à jour à chaque demande.


Oui, dans ce cas, vous ne pourrez pas signaler l'utilisateur. Nous pourrions entrer dans un débat d'opinion sur les avantages de la suppression progressive (désactivation) par rapport à la suppression définitive, mais ce serait inutile. Lorsque vous supprimez des utilisateurs, je suggérerais de "tuer" leurs sessions lors de la suppression de l'utilisateur, de les déconnecter et de les verrouiller efficacement (donc pas besoin de les forcer à les déconnecter plus tard)