Benutzerdefinierte WordPress-Anmeldeanforderung und Fehlermeldung mit Authenticate-Hook

Lesezeit: 5 Minuten

Benutzer-Avatar
Schotsl

Aus Sicherheitsgründen möchte ich, dass jeder Benutzer einer bestimmten Domain (vorerst habe ich @company.com verwendet) gezwungen wird, sich über die Schaltfläche “Login mit Google” anzumelden, also habe ich diese Überprüfung geschrieben.

Was gut funktioniert, aber die Fehlermeldung auf der Anmeldeseite ändert sich nicht, heißt es FOUT: Verkeerde logingegevens. das ist niederländisch für ERROR: Wrong credentials.. Ich habe einen neuen Fehler mit einer anderen Nachricht zurückgegeben, also wie würde ich diese Nachricht anzeigen?

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);

  • Haben Sie ein Sicherheits-Plugin oder ein anderes Plugin eines Drittanbieters, das diese Fehlermeldung behandelt? Weil es nicht Teil von WP Core ist

    – Tofandel

    17. März 2020 um 11:04 Uhr


Benutzer-Avatar
Tofandel

WordPress-Kern

Ihr Problem ergibt sich aus der Tatsache, dass die $user Variable, die Sie filtern, ist bereits a WP_Error und nicht ein WP_UserIhr Filter kann also nicht funktionieren, weil $user->user_email ist nullhoffentlich verwendet WordPress einen weiteren Zwischenhaken in seiner Anmeldefunktion

Sie sollten stattdessen diesen Filter verwenden wp_authenticate_user die ausgelöst wird, nachdem der Benutzer aus der Datenbank abgerufen wurde, aber bevor das Passwort überprüft wurde, und den Benutzer in einen WP_Error umwandelt

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);

Plugin von Drittanbietern

Wenn Sie ein Sicherheits-Plugin verwenden, haben sie normalerweise eine Option, die Fehlermeldungen bei der Anmeldung deaktiviert. Hier erfahren Sie, wie Sie sie in einigen wichtigen deaktivieren können

ITemes-Sicherheit

Eine Option, die dieses Plugin bietet, ist das Ausblenden aller Anmeldefehlermeldungen. Sie können dies in den Einstellungen des Plugins deaktivieren > WordPress Tweaks > Anmeldungsfehlermeldungen deaktivieren
IthemesSicherheitsoptionen

Oder greifen Sie auf diese Seite zu, indem Sie diese URL an Ihre Website anhängen /wp-admin/admin.php?page=itsec&module=wordpress-tweaks&module_type=recommended

Wordfence

Dieses Plugin gibt dem Benutzer eine allgemeine Fehlermeldung, um zu verhindern, dass preisgegeben wird, wenn das Passwort oder der Benutzername falsch ist. Sie können diese Option dort deaktivieren
Geben Sie hier die Bildbeschreibung ein

  • Wie Sie im Kommentar vorgeschlagen haben, scheint es sich um ein Plugin eines Drittanbieters zu handeln, das den Fehler verursacht. Denn egal welche Fehlermeldung ich übergebe, ich bekomme immer nur “ERROR: Invalid login Credentials”. Ich bin gerade nicht bei der Arbeit, um weiter zu suchen, aber Ihr Code ist der kürzeste und die Frist für das Kopfgeld nähert sich, also werde ich dies als Antwort markieren und meine Frage bearbeiten, sobald ich das Problem gelöst habe

    – Schotsl

    17. März 2020 um 13:03 Uhr

  • Sicher, ich bin immer noch verfügbar, wenn Sie weitere Informationen benötigen. Es könnte IThemesSecurity sein, das diese Nachricht hinzufügt

    – Tofandel

    17. März 2020 um 13:39 Uhr

Benutzer-Avatar
SacheAlles

Sie müssen den ursprünglichen Authentifizierungsfilter entfernen und durch Ihren eigenen ersetzen.

Auf diese Weise können Sie für jeden Fall eine benutzerdefinierte Fehlermeldung festlegen.

Stellen Sie einfach sicher, dass Sie Ihre Gewohnheit hinzufügen @company.com Überprüfen Sie oben, bevor Sie nach anderen Fällen suchen.

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="https://stackoverflow.com/questions/60567079/%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;
}

FYI, ich habe diesen Code gefunden hier.

  • Das ist ein bisschen übertrieben und ich würde nicht empfehlen, WP-Kernfunktionen neu zu schreiben, es gibt eine einfachere Lösung

    – Tofandel

    17. März 2020 um 10:43 Uhr

  • @Tofandel Ausgezeichnet. Gut zu wissen.

    – SacheAlles

    18. März 2020 um 4:45 Uhr

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;
}

1344340cookie-checkBenutzerdefinierte WordPress-Anmeldeanforderung und Fehlermeldung mit Authenticate-Hook

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy