Пользовательское требование входа в WordPress и сообщение об ошибке с использованием хука аутентификации - PullRequest
5 голосов
/ 06 марта 2020

В целях безопасности я хочу, чтобы каждый пользователь из определенного домена (на данный момент я использовал @ company.com) будет вынужден войти в систему с помощью кнопки входа в систему с помощью Google, поэтому я написал эту проверку.

Это прекрасно работает, но сообщение об ошибке на странице входа в систему не меняется, оно говорит FOUT: Verkeerde logingegevens., что на голландском языке означает ERROR: Wrong credentials.. Я возвратил новую ошибку с другим сообщением, так как бы я отобразил это сообщение?

function check_login($user, $username, $password) {
    if (!empty($username)) {
        if (substr($user->user_email, -12) == "@company.com") {
            $user = new WP_Error( 'authentication_failed', __( '<strong>ERROR</strong>: Please login using Google.' ) );
        }
    }

    return $user;
}

add_filter('authenticate', 'check_login', 100, 3);

Ответы [ 3 ]

2 голосов
/ 17 марта 2020

Wordpress Core

Ваша проблема связана с тем, что фильтруемая переменная $user уже WP_Error, а не WP_User, поэтому ваш фильтр не может работать, поскольку $user->user_email null, надеюсь, Wordpress использует другой промежуточный хук в своей функции входа в систему

Вместо этого вы должны использовать этот фильтр wp_authenticate_user, который сработает после извлечения пользователя из базы данных, но до того, как пароль будет проверил, преобразовав пользователя в WP_Error

function check_login($user) {
    if ($user instanceof WP_User) {
        if (substr($user->user_email, -12) == "@company.com") {
            $user = new WP_Error( 'authentication_failed', __( '<strong>ERROR</strong>: Please login using Google.' ) );
        }
    }

    return $user;
}

add_filter('wp_authenticate_user', 'check_login', 9, 1);

Сторонний плагин

Если вы используете плагин безопасности, у них обычно есть опция, которая отключает сообщения об ошибках входа в систему, вот как это отключить в некоторых из них

IThemes Security

Один из вариантов, который предоставляет этот плагин, - скрывать все сообщения об ошибках входа в систему. Вы можете отключить это в настройках плагина> Настройки Wordpress> Снять отметки с сообщений об ошибках входа ithemessecurity options

Или перейдите на эту страницу, добавив этот URL на свой веб-сайт /wp-admin/admin.php?page=itsec&module=wordpress-tweaks&module_type=recommended

Wordfence

Этот плагин выдает пользователю общее сообщение об ошибке c, чтобы предотвратить выявление неправильного пароля или имени пользователя. Вы можете отключить эту опцию там enter image description here

1 голос
/ 10 марта 2020

Вам нужно будет удалить оригинальный фильтр аутентификации и заменить его своим.

Таким образом, вы можете установить пользовательское сообщение об ошибке для каждого отдельного случая.

Просто добавьте свою пользовательскую проверку @company.com вверху, прежде чем проверять другие случаи.

remove_filter('authenticate', 'wp_authenticate_username_password');
add_filter('authenticate', 'wpse_115539_authenticate_username_password', 20, 3);
/**
 * Remove Wordpress filer and write our own with changed error text.
 */
function wpse_115539_authenticate_username_password($user, $username, $password) {

  if (!empty($username)) {
    if (substr($user->user_email, -12) == "@company.com") {
      return new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Please login using Google.'));
    }
  }

  if (is_a($user, 'WP_User'))
    return $user;

  if (empty($username) || empty($password)) {
    if (is_wp_error($user))
      return $user;

    $error = new WP_Error();

    if (empty($username))
      $error->add('empty_username', __('<strong>ERROR</strong>: The username field is empty.'));

    if (empty($password))
      $error->add('empty_password', __('<strong>ERROR</strong>: The password field is empty.'));

    return $error;
  }

  $user = get_user_by('login', $username);

  if (!$user)
    return new WP_Error('invalid_username', sprintf(__('<strong>ERROR</strong>: Invalid username. <a href="%s" title="Password Lost and Found">Lost your password</a>?'), wp_lostpassword_url()));

  $user = apply_filters('wp_authenticate_user', $user, $password);
  if (is_wp_error($user))
    return $user;

  if (!wp_check_password($password, $user->user_pass, $user->ID))
    return new WP_Error('incorrect_password', sprintf(__('<strong>ERROR</strong>: The password you entered for the username <strong>%1$s</strong> is incorrect. <a href="%2$s" title="Password Lost and Found">Lost your password</a>?'),
      $username, wp_lostpassword_url()));

  return $user;
}

К вашему сведению, я нашел этот код здесь .

0 голосов
/ 17 марта 2020
function wp_authenticate( $username, $password ) {
    $username = sanitize_user( $username );
    $password = trim( $password );


    $user = apply_filters( 'authenticate', null, $username, $password );

    if ( $user == null ) {
        // TODO what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error( 'authentication_failed', __( '<strong>ERROR</strong>: Invalid username, email address or incorrect password.' ) );
    }

    $ignore_codes = array( 'empty_username', 'empty_password' );

    if ( is_wp_error( $user ) && ! in_array( $user->get_error_code(), $ignore_codes ) ) {

        do_action( 'wp_login_failed', $username );
    }

    return $user;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...