Добавление дополнительного поля аутентификации на странице входа

17 мар. 2012 г., 13:19:43
Просмотры: 15.5K
Голосов: 7

Я хочу улучшить страницу аутентификации в WordPress. Моя идея — добавить дополнительное поле на страницу входа. Это поле будет требовать от пользователя ввода персонального идентификационного кода (от 4 до 8 цифр).

Я изменил макет страницы входа в wp-login.php и добавил дополнительный столбец для хранения персонального идентификационного кода в базе данных MySQL.

Однако я не знаю, в какой части кода происходит проверка пароля, так как хочу обратиться к существующему коду.

Как я могу эффективно это сделать?

0
Все ответы на вопрос 3
1
17

Прежде всего, я бы не рекомендовал редактировать основные файлы, так как они будут перезаписаны при следующем обновлении 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 для:

Для проверки пользователей можно использовать фильтр 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;
}
17 мар. 2012 г. 13:41:23
Комментарии

Жаль, что это не было отмечено как правильный ответ, так как это идеально объяснённое и закодированное решение, которое работает на 100%.

Nathan Nathan
4 дек. 2020 г. 17:08:56
0

Этот ответ предоставлен только для справки.

Вам не следует редактировать основные файлы 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;
}
17 мар. 2012 г. 13:30:44
0

Если редактирование всего этого кода кажется немного пугающим, есть хороший плагин для этого:

Cimy Extra Fields

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

17 мар. 2012 г. 14:31:04