# wp_destroy_all_sessions : déconnecter partout après un nouveau mot de passe

> Invalider automatiquement toutes les sessions actives d'un compte dès qu'un nouveau mot de passe est défini, sans attendre une action manuelle.

- Auteur : Clément Hadrot
- Publié le : 2023-09-26
- Mis à jour le : 2023-09-26
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/wp-destroy-all-sessions-deconnecter-nouveau-mot-de-passe/

## L’essentiel

- Changer son mot de passe ne déconnecte pas automatiquement les autres sessions
- wp_destroy_all_sessions invalide toutes les sessions d'un utilisateur donné
- Le hook password_reset couvre le cas d'une réinitialisation par e-mail

Un client a découvert, un peu tard, qu'un ancien collaborateur licencié plusieurs semaines auparavant restait toujours connecté à l'administration WordPress depuis son ordinateur personnel, malgré un changement de mot de passe effectué entre-temps par prudence. La raison est simple et rarement anticipée : par défaut, WordPress ne déconnecte jamais automatiquement les sessions existantes lorsqu'un mot de passe change. La session active, tant qu'elle n'expire pas naturellement, continue de fonctionner normalement, avec l'ancien cookie d'authentification toujours valide.

La fonction `wp_destroy_all_sessions()`, disponible depuis WordPress 4.1 avec l'introduction du gestionnaire de sessions, permet justement de corriger ce comportement en invalidant explicitement toutes les sessions d'un utilisateur au moment opportun.

## Le hook à utiliser pour un changement depuis le profil

Quand un utilisateur change son propre mot de passe depuis son écran de profil, WordPress déclenche l'action `after_password_reset`, qui reçoit l'objet utilisateur concerné :

```
function sc_deconnecter_apres_changement_mdp( $user, $nouveau_mot_de_passe ) {
    if ( function_exists( 'wp_destroy_all_sessions' ) ) {
        // On se place dans le contexte de l'utilisateur concerné avant de tout invalider
        $utilisateur_courant_avant = wp_get_current_user();
        wp_set_current_user( $user->ID );
        wp_destroy_all_sessions();
        wp_set_current_user( $utilisateur_courant_avant->ID );
    }
}
add_action( 'after_password_reset', 'sc_deconnecter_apres_changement_mdp', 10, 2 );
```

Cette bascule temporaire de l'utilisateur courant est nécessaire car `wp_destroy_all_sessions()` agit toujours sur l'utilisateur actuellement défini dans le contexte d'exécution, sans accepter d'identifiant en paramètre direct.

> L'essentiel à retenir : Changer son mot de passe ne déconnecte pas automatiquement les autres sessions ; wp_destroy_all_sessions invalide toutes les sessions d'un utilisateur donné ; Le hook password_reset couvre le cas d'une réinitialisation par e-mail

## Couvrir aussi la réinitialisation par e-mail

Le scénario de réinitialisation via le lien reçu par e-mail, distinct du changement volontaire depuis le profil, utilise le même hook `after_password_reset`, ce qui simplifie la couverture complète du besoin avec une seule fonction déjà écrite ci-dessus, sans traitement supplémentaire à ajouter.

## Conserver volontairement la session en cours

Un piège fréquent avec `wp_destroy_all_sessions()` est de déconnecter également la session depuis laquelle l'utilisateur vient tout juste de changer son mot de passe, ce qui produit une expérience désagréable : un formulaire de changement de mot de passe qui semble avoir échoué, puisque l'utilisateur se retrouve immédiatement déconnecté après validation. Pour ne conserver que la session courante active et invalider uniquement les autres, la fonction complémentaire `wp_destroy_other_sessions()` convient mieux à ce cas d'usage précis :

```
function sc_deconnecter_autres_sessions( $user, $nouveau_mot_de_passe ) {
    $utilisateur_courant_avant = wp_get_current_user();
    wp_set_current_user( $user->ID );
    wp_destroy_other_sessions(); // garde la session courante active
    wp_set_current_user( $utilisateur_courant_avant->ID );
}
add_action( 'after_password_reset', 'sc_deconnecter_autres_sessions', 10, 2 );
```

## Vérifier le résultat côté administration

L'écran de profil de chaque utilisateur affiche normalement une section listant les sessions actives avec un bouton « Déconnecter partout ailleurs », interface manuelle qui s'appuie sur exactement les mêmes fonctions présentées ici. Après la mise en place de ces hooks, tester un changement de mot de passe puis vérifier, depuis un second navigateur resté connecté, que la session y est bien devenue invalide constitue la validation la plus fiable.

## Ce que cette automatisation ne couvre pas

- La consultation et la révocation manuelle de sessions actives depuis l'écran de profil restent un sujet distinct, déjà traité séparément côté sécurité.
- Cette protection ne concerne que les sessions basées sur les cookies WordPress classiques, pas d'éventuels jetons d'API générés séparément pour des intégrations tierces.

> Sur tout projet où plusieurs personnes partagent un accès administrateur au fil du temps, ce réflexe de déconnexion automatique après changement de mot de passe devrait être un standard appliqué dès le départ, pas une correction ajoutée après un incident.

## En résumé

`wp_destroy_all_sessions()` et sa variante `wp_destroy_other_sessions()`, accrochées au hook `after_password_reset`, referment une faille de sécurité discrète mais bien réelle : un changement de mot de passe qui ne déconnecte personne d'autre nulle part. Une poignée de lignes suffit à corriger ce comportement pour l'ensemble des comptes du site.
