WordPressではログインにユーザー名またはメールアドレスを使用できますが、//example.com/?author=1
のURLで著者アーカイブページにアクセスされることで、ユーザー名は簡単にバレてしまします。
著者アーカイブをリダイレクトで見れないようにするのが一番なのですが、それができない場合はログイン時にユーザー名を使えないようにしておくとセキュリティ的には少し安心ですきます。
ということで、今回はWordPressへのログイン時に、メールアドレスからしか認証できないようにするコードをメモしておこうと思います。
目次
ログイン認証をEメールアドレスだけに強制するコード
以下のコードをfunctions.phpへ記述するだけ。
ログイン認証をEメールだけ通す
/**
* $user : null or WP_User or WP_Error
* $username : 入力されたユーザー名
* $password : 入力されたパスワード
*/
function force_email_login( $user, $username, $password ) {
//「ユーザー名またはメールアドレス」に入力された情報を email情報 としてユーザー検索
$user_data = get_user_by( 'email', $username );
if( !empty( $user_data ) ) {
//email情報からユーザーが見つかればログイン認証用の関数にデータを渡す
return wp_authenticate_username_password( null, $user_data->user_login, $password );
}
//emailでユーザー取得できなかった場合
return wp_authenticate_username_password( null, '___', $password );
}
add_filter('authenticate', 'force_email_login', 20, 3);
簡単な説明
'authenticat'
というログイン認証用のフックを利用します。
ログイン画面の「ユーザー名またはメールアドレス」の項目に入力された情報が$username
という変数(フックさせた関数の第二引数)で使用できるので、この情報を強制的に「Eメールアドレス」の情報として扱っています。
get_user_by()
関数を使用し、登録済みユーザーのメールアドレス情報と$username
を照合させます。- ユーザーが見つかった場合はユーザー情報オブジェクト(
$user_data
)が取得できるので、そのデータ内の'user_login'
というキーでユーザー名を取得。 - ユーザーが見つからなかった場合は、ユーザー名を
'__'
(ありえないユーザー名)とします。 - 最後に、ログイン認証関数
wp_authenticate_username_password()
にデータを渡します。
※:メールアドレスからユーザーが見つからなかった場合にユーザー名を空文字やnullにしてもいいのですが、エラーメッセージが「ユーザー名を入力してください」という内容になってしまいます。
久しぶりに自分でログインした時に、メールアドレスで強制していることを忘れていて混乱した体験があるので、個人的には上記のようにしています。