Empêcher de se connecter avec une adresse mail

Depuis la version 4.5 de WordPress,  il est possible de se connecter à l’administration d’un site en utilisant l’adresse mail à la place du nom de l’utilisateur.
Cette possibilité, disponible sur de nombreux sites grands publics (commerce en ligne, réseaux sociaux…)  présente l’inconvénient d’affaiblir la sécurité, car il est plus facile pour un pirate de trouver une adresse mail qu’un identifiant inventé.
Cet article montre comment retirer cette fonctionnalité.

Nouveau formulaire de connexion

Avant la version 4.5 de WordPress, le formulaire de connexion était le suivant :

Le formulaire de connexion ne propose que la connexion via un idetifiant
Le formulaire de connexion avant la 4.5

À partir de la version 4.5, WordPress accepte aussi l’adresse de messagerie de l’utilisateur.
Bien évidemment, le mot de passe à saisir est celui de l’utilisateur, que celui-ci soit identifié par son identifiant ou son adresse de messagerie :

WordPress propose d'identifier l'utilisateur qui se connecte par son identifiant ou son adresse de messagerie
Formulaire de connexion après la version 4.5

Rappel : l’identifiant d’un utilisateur et son adresse mail sont visibles dans la page de description des utilisateurs dans l’administration :

La liste des utilisateurs s'affiche avec notamment leur identifiant et leur adresse mail
Exemple de description d’utilisateurs déclarés dans un site
Haut de page

Supprimer la connexion par email

Pour l’authentification d’un utilisateur par mot de passe, WordPress fait appel à la fonction « wp_authenticate_email_password() ».

Description de la fonction "wp_authenticate_email_password()" dans le codex WordPress
Cliquer pour accéder à la description de la fonction « wp_authenticate_email_password » dans le codex

Cette fonction est appelée dans le filtre « authenticate« . Il suffit de retirer (remove en anglais) la fonction « wp_authenticate_email_password » pour ne plus permettre la connexion avec un adresse mail :

remove_filter( ‘authenticate‘, ‘wp_authenticate_email_password’, 20 );

Pour retirer une fonction d’un filtre, il faut obligatoirement préciser :

  • l’identifiant du filtre : ici « authenticate »,
  • le nom de la fonction à retirer du filtre : ici « wp_authenticate_email_password »,

Pour s’assurer de retirer la fonction souhaitée, il est possible de préciser la priorité qui avait été définie lorsque la fonction avait été ajoutée au filtre (ici : « 20 »).

Haut de page

Modifier les textes affichés

Désormais, il n’est plus possible de se connecter en utilisant l’adresse mail, mais les visiteurs sont toujours invités à saisir leur adresse mail :

Dans le formulaire de connexion, WordPress continue à proposer la saisie de l'adresse mail
WordPress propose toujours de saisir l’adresse de messagerie

Le filtre gettext

Les textes affichés par le noyau WordPress sont en anglais mais passent par une procédure de traduction.

Si on regarde dans le fichier wp-login.php, on trouve le code correspondant, avec la fonction de traduction (« _e() » et le texte à traduire :

<label for= »user_login » ><?php _e(Username or Email‘) ?><br />

Les fonctions de traduction passent par le filtre « gettext » qui permet de modifier la traduction standard.
Le code ci-dessous permet de modifier la traduction des textes invitant à utiliser un email pour se connecter.


Nous commençons par ajouter au crochet « gettext » la fonction personnalisée « wpdf_retire_adr_mail », avec une priorité moyenne (« 10« ) et en récupérant trois paramètres :

add_filter( ‘gettext‘, ‘wpdf_retire_adr_mail’, 10, 3 );

La fonction associée au crochet « gettext » récupère trois paramètres :

  • le texte tel qui est traduit jusque là : « $wpdf_translated_text »,
  • le texte qui était à traduire : $wpdf_text,
  • le domaine de traduction : $wpdf_domain.

function wpdf_retire_adr_mail( $wpdf_translated_text, $wpdf_text, $wpdf_domain ) {


La fonction commence par tester si :

  • l’installation WordPress est en français,
  • il n’y a pas dans l’url appelant la page un paramètre « action= ».
    « wp-login.php » peut être appelé pour différents types d’actions telles que la réinitialisation du mot de passe pour lequel il n’est pas nécessaire d’empêcher l’utilisation de l’adresse mail.

if (substr(get_locale(), 0, 3) == ‘fr_’ && !isset($_REQUEST[‘action’]) ) {


Les textes à traduire sont repérables par une recherche des fonctions de traduction ( « __( » et « _e( » ) dans le fichier « wp-login.php ».
La liste des textes à traduire est recopiée dans un tableau en leur associant les nouvelles traductions souhaitées :

$wpdf_list_textes = array (
<strong>ERROR</strong>: Enter a username or email address.’ => ‘<strong>ERREUR</strong>: Saisir un identifiant.‘,
Username or Email‘ => ‘Identifiant
);

La fonction php « array_key_exists » recherche si le texte à traduire  est une clé du tableau des textes à traduire.
Si oui, la  traduction en cours est remplacée par la valeur définie dans le tableau des traductions :

if( array_key_exists ( $wpdf_text , $wpdf_list_textes ))
$wpdf_translated_text = $wpdf_list_textes [$wpdf_text];
} // fin test si site en français


La fonction retourne le texte traduit, éventuellement modifié :

return $wpdf_translated_text;
} // fin fonction wpdf_retire_adr_mail

Améliorer l’utilisation de « gettext »

Le code ci-dessus fonctionne, mais est exécuté lors de tout appel des fonctions de traduction (par le noyau WordPress, par le thème courant et par les extensions activées).

Pour l’éviter, nous n’ajouterons les fonctions visant à empêcher la connexion par email, que si le fichier « wp-login.php » est en cours d’exécution. Pour se faire, nous utilisons le crochet « login_init » qui est déclenché en début d’exécution de « wp-login.php » :

// Empêcher la connexion par email
add_action( ‘login_init‘, function () {
// retirer filtre permettant la connexion par email
remove_filter( ‘authenticate’, ‘wp_authenticate_email_password’, 20 );
// Modifier les messages indiquant la possibilité d’utiliser l’adresse mail pour se connecter
add_filter( ‘gettext’, ‘wpdf_retire_adr_mail’, 10, 3 );
}); // fin fonction blocage connexion par email

Il est intéressant de remarquer qu’on utilise un crochet (« login_init ») pour retirer une fonction d’un crochet (« remove_filter ») et en ajouter à un autre (‘add_filter »).

Haut de page

L’ensemble du code

//	Empêcher la connexion par email
add_action( 'login_init', function () {
	//	retirer filtre permettant la connexion par email
	remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
	//	Modifier les messages indiquant la possibilité d'utiliser l'adresse mail pour se connecter
	add_filter( 'gettext', 'wpdf_retire_adr_mail', 10, 3 );
});	//	fin fonction blocage connexion par email


function wpdf_retire_adr_mail( $wpdf_translated_text, $wpdf_text, $wpdf_domain ) {
	if (substr(get_locale(), 0, 3) == 'fr_' && !isset($_REQUEST['action']) ) {
		$wpdf_list_textes = array (
			'<strong>ERROR</strong>: Enter a username or email address.' => '<strong>ERREUR</strong>: Saisir un identifiant.',
			'Username or Email' => 'Identifiant'
		);
		if( array_key_exists ( $wpdf_text , $wpdf_list_textes )) $wpdf_translated_text = $wpdf_list_textes [$wpdf_text];
	}	//	fin test si site en français
return $wpdf_translated_text;
}	//	fin fonction wpdf_retire_adr_mail
Code pour empêcher la connexion par adresse mail

 

2 réflexions sur « Empêcher de se connecter avec une adresse mail »

  1. Bonjour,

    Merci beaucoup pour cette article! Je souhaiterai pour ma part faire l’inverse. En l’occurence, permettre le login uniquement par EMAIL et donc empêcher la connexion par username. Est ce que c’est possible?

    Merci par avance de votre retour.

    1. Bonjour,

      Je n’ai pas le temps de tester, mais il est possible de s’inspirer de l’article ci-dessus :
      – en utilisant le filtre « wp_authenticate_username_password » à la place du filtre « wp_authenticate_email_password »,
      – et en adaptant l’utilisation du filtre « gettext »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.