web-dev-qa-db-fra.com

Forcer intentionnellement l'échec de la connexion à WordPress

J'essaie de forcer la fonction de connexion WordPress à échouer sous certaines conditions. Fondamentalement, nous avons des utilisateurs qui ont laissé leurs comptes expirer dans notre environnement d’adhésion. L'idée est que s'ils essaient de se connecter, leur connexion échoue car ils ne pourront accéder à rien de toute façon. Je pense donc que nous leur faisons savoir avec un message login_errors personnalisé.

Le problème est que l'utilisateur doit avoir une erreur de connexion pour que cela se produise (ce qui signifie qu'il doit utiliser une combinaison nom d'utilisateur/mot de passe incorrecte). Dans ce cas, ils ont toujours des identifiants mais ils ne disposent pas d'un abonnement valide pour interagir avec le contenu du site.

J'intercepte le processus à l'aide du hook wp_authenticate et je parviens à récupérer les informations de l'utilisateur qui se connecte, mais je n'arrive pas à le forcer à renvoyer une erreur. Si je return false ou return new WP_Error() cela ne fonctionne pas. Si je change les informations d'identification dans le flux, cela ne semble pas avoir d'importance non plus.

Des idées sur la façon de forcer l'échec de la connexion et la redirection vers la page de connexion avec le nouveau message d'erreur?

3
MxmastaMills

Il y a longtemps que je l'ai fait pour la dernière fois sur un site, mais c'est le Gist.

Vous souhaitez vous connecter à wp_authenticate_user qui se déclenchera après que WP ait tenté d'authentifier l'utilisateur, mais avant de le connecter.

Vous recevrez soit un objet WP_User, soit un objet WP_Error. Vous devrez alors renvoyer un objet WP_User (si votre vérification d'authentification réussit) ou un objet WP_Error (si votre autorisation échoue). Quelque chose comme ça devrait marcher:

function wpse_232915_authenticate_user( $user ) {

    /* already failed login attempt
       return existing error or you'll subvert the login process:
    */
    if ( is_wp_error( $user ) ) {
        return $user;
    }

    $failure = your_own_authentication_tests( $user->ID ); // test if the user should be allowed in by your own rules

    if ( $failure ) {
        return new WP_Error( 'wpse_232915_user_expired', 'Sorry, you have expired!' );
    }

    return $user;
}

add_filter( 'wp_authenticate_user', 'wpse_232915_authenticate_user' );

Selon la complexité de votre test, vous pouvez renvoyer l'objet WP_Error à partir de cette fonction plutôt que true/false, comme je l'ai supposé ici.

Je ne suis pas assez à l'aise avec WP_Error pour savoir si vous pouvez enchaîner les erreurs ou si la zone de notification d'erreur de connexion vous convient, mais c'est une amélioration qui mérite d'être examinée.

1
Andy Macaulay-Brook