Добавление дополнительного поля аутентификации на странице входа
Я хочу улучшить страницу аутентификации в WordPress. Моя идея — добавить дополнительное поле на страницу входа. Это поле будет требовать от пользователя ввода персонального идентификационного кода (от 4 до 8 цифр).
Я изменил макет страницы входа в wp-login.php
и добавил дополнительный столбец для хранения персонального идентификационного кода в базе данных MySQL.
Однако я не знаю, в какой части кода происходит проверка пароля, так как хочу обратиться к существующему коду.
Как я могу эффективно это сделать?

Прежде всего, я бы не рекомендовал редактировать основные файлы, так как они будут перезаписаны при следующем обновлении WordPress.
Также вы должны обновлять WordPress, потому что обновления часто включают исправления безопасности. (Недавно сообщалось, что участились атаки на сайты с устаревшими версиями WordPress)
Для реализации вашей задачи я рекомендую использовать хуки как лучший способ модификации WordPress.
Таким образом, чтобы добавить дополнительное поле на страницу входа, вы можете использовать хук действия login_form
:
add_action('login_form','my_added_login_field');
function my_added_login_field(){
//Вывод вашего HTML
?>
<p>
<label for="my_extra_field">Мое дополнительное поле<br>
<input type="text" tabindex="20" size="20" value="" class="input" id="my_extra_field" name="my_extra_field_name"></label>
</p>
<?php
}
Далее нам нужно проверить, соответствует ли введенное значение сохраненному. В следующем коде я предполагаю, что вы сохранили идентификационный код как пользовательское мета-значение с ключом my_ident_code
. Вам следует делать именно так, а не создавать собственный столбец! См. страницы Codex для:
- Функции
add_user_meta
- Функции
update_user_meta
- Функции
get_user_meta
Для проверки пользователей можно использовать фильтр authenticate
. Он передает введенные имя пользователя и пароль. Если идентификационный код верен, верните null
, чтобы позволить WordPress проверить пароль и имя пользователя. Если код неверен, отключите стандартную аутентификацию WordPress и верните ошибку. Это вернет пользователя на страницу входа, где он увидит сообщение об ошибке.
add_filter( 'authenticate', 'my_custom_authenticate', 10, 3 );
function my_custom_authenticate( $user, $username, $password ){
//Получаем отправленное значение
$my_value = $_POST['my_extra_field_name'];
//Получаем объект пользователя
$user = get_user_by('login', $username );
//Получаем сохраненное значение
$stored_value = get_user_meta($user->ID, 'my_ident_code', true);
if(!$user || empty($my_value) || $my_value !=$stored_value){
//Пользователь не найден, значение не введено или не совпадает с сохраненным - не продолжаем
remove_action('authenticate', 'wp_authenticate_username_password', 20);
remove_action('authenticate', 'wp_authenticate_email_password', 20);
//Создаем ошибку для отображения пользователю
return new WP_Error( 'denied', __("<strong>ОШИБКА</strong>: Ваш уникальный идентификатор недействителен.") );
}
//Убедитесь, что возвращаете null
return null;
}

Этот ответ предоставлен только для справки.
Вам не следует редактировать основные файлы WordPress, иначе вы потеряете свои изменения после обновления.
Ниже показано, как WordPress обрабатывает процесс проверки пароля при входе, как видно в строке 250 файла /wp-includes/class-phpass.php
:
function CheckPassword($password, $stored_hash)
{
$hash = $this->crypt_private($password, $stored_hash);
if ($hash[0] == '*')
$hash = crypt($password, $stored_hash);
return $hash == $stored_hash;
}

Если редактирование всего этого кода кажется немного пугающим, есть хороший плагин для этого:
Или вы можете рассмотреть использование Theme My Login, который может это сделать, но требует некоторого программирования. Он также добавляет довольно много дополнительной функциональности. Вы можете спокойно использовать эти два плагина вместе.
