it-swarm.com.de

Richtige Möglichkeit zum Übergeben von Anmeldeinformationen in einem benutzerdefinierten Anmeldeformular, um zu verhindern, dass bereits gesendete Header angezeigt werden.

Ich arbeite an einem benutzerdefinierten Anmeldeseiten-Plugin. Ich versuche herauszufinden, wie der Benutzer angemeldet werden kann, ohne dass "bereits gesendete Header" -Fehler auftreten.

Ich habe wp_signon direkt aufgerufen, nachdem der Benutzer auf "Anmelden" geklickt hat, aber schnell festgestellt, dass dieser Ansatz "bereits gesendete Header" -Fehler verursacht. Ich habe auf Hooks umgestellt:

private function attemptLogin() {
    add_action( 'after_setup_theme', array( $this->Cms, 'authenticateUser' ), 10, 2 );
    do_action( 'after_setup_theme', $_POST['username'], $_POST['password'] );
}

Aber wie Sie wahrscheinlich erraten haben, führt dies zu denselben Fehlern, da ich die Anmeldung im Wesentlichen immer noch sofort durchführe.

Wie kann ich den Hook nach eigenem Zeitplan ausführen lassen, um Fehler zu vermeiden, und gleichzeitig die Anmeldeinformationen des Benutzers zur Verfügung stellen?

Ich habe sowohl Google als auch diese Website nach der vergeblichen Antwort durchsucht. Die Antwort, die ich am nächsten gefunden habe, ist , aber ich bin mir immer noch nicht sicher, wie ich den Rat umsetzen soll, während ich noch die Anmeldeinformationen des Benutzers weitergebe.

1
Nathan Arthur

Bei erfolgreicher Anmeldung setzt wp_signon() ein Cookie im http-Antwortheader. Daher muss es aufgerufen werden, bevor eine HTML-Ausgabe an den Browser gesendet wird. Andernfalls tritt der Fehler "Bereits gesendete Header" auf.

Nach einer erfolgreichen Anmeldung sollten Sie Ihren Benutzer umleiten. Andernfalls werden die Anmeldeinformationen beim Rendern der HTML-Seite nicht angezeigt.

Ein sehr skizzenhafter, aber funktionierender Code:

// process login requests each time wordpress renders a page. 
function my_custom_login_process() {
    // check if login credentials are present in the current http request
    if ( isset( $_POST['user_login'] ) && isset( $_POST['user_password'] ) ) {
        // try login
        $user = wp_signon( $_POST );

        if ( is_wp_error($user) ) // didn't work. Tell the user.
            exit('Nope...');
        else // worked! Get him somewhere.
            wp_redirect( get_bloginfo('url') );
    }
}
add_action('after_setup_theme','my_custom_login_process');

Darüber hinaus sollten Sie Ihr Anmeldeformular mit einem Nonce schützen und der obigen Funktion eine Nonce-Bestätigung hinzufügen. Der einfachste Weg, dies zu tun, ist die Verwendung von wp_nonce_field() im Anmeldeformular.

Nonces erklärt

[EDIT]: Ein Nonce ist ein eindeutiger Token, der zusammen mit einem Formular registriert wird. Es wird hauptsächlich verwendet, um sicherzustellen, dass ein Formular vom Webserver generiert wurde, bevor Daten zur weiteren Verarbeitung akzeptiert werden. Alle Formulare im Admin-Bereich verwenden Nonces (oder sollten es zumindest tun).

Während des Anmeldevorgangs wird ein grundlegender Schutz gegen Brute-Force-Angriffe bereitgestellt. (Dies bedeutet, dass Sie WordPress mit leeren POST Anfragen überfluten, die beliebige Kombinationen aus Benutzername und Passwort enthalten.)


(Übrigens: Anscheinend haben Sie ein kleines Missverständnis in Bezug auf Hooks. Sie sollten sich wirklich nicht registrieren (do_action()) und einen Hook (do_action()) mit beliebigen Funktionsargumenten aufrufen. Andere Plugins haben möglicherweise auch ihre Funktionen registriert Dieser Artikel scheint ein ziemlich guter Ausgangspunkt für ein tieferes Verständnis zu sein.)

2
Jörn Lund