Kann ich einen Benutzer programmgesteuert ohne Kennwort anmelden?

32

Ich erstelle Benutzer manuell programmgesteuert und möchte mich bei dem neu erstellten Benutzer anmelden. WP erleichtert den Zugriff auf das Hash-Passwort, nicht jedoch auf die Nur-Text-Version. Gibt es eine Möglichkeit, wp_signon () ohne das Klartext-Passwort zu verwenden?

Ich fand eine Person , die dies getan hat behauptet, hier , aber es funktioniert nicht für mich arbeiten.

VIELEN DANK!

emersonthis
quelle
Ich denke, Sie können einfach das Benutzerobjekt des Benutzers, den Sie gerade erstellt haben, der globalen Variablen
current_user zuweisen

Antworten:

32

wp_set_auth_cookie() meldet einen Benutzer an, ohne sein Passwort zu kennen.

Milo
quelle
Das hat super funktioniert. Wenn ich es jedoch verwende, is_user_logged_in()scheint die Bedingung nicht zu funktionieren. Wissen Sie, ob es sich um etwas anderes als die Cookies handelt?
emersonthis
2
@Emerson - an welchem ​​Hook loggst du sie ein? Es muss sein, bevor Header gesendet werden. Versuche es auch, wp_set_current_userbevor du
Milo
Ich habe es eigentlich gar nicht aus dem Häkchen gerufen. Ich habe gerade wp_set_auth_cookie()meine Anmeldefunktion hinzugefügt . Ich denke, ich muss das überdenken. Ich werde auch nach wp_set_current_user suchen und darüber berichten. Vielen Dank für Ihre Hilfe!
emersonthis
Ist es möglich, einen Benutzer anzumelden, ohne dass seine Daten in der Datenbank vorhanden sind? Nur ein paar Cookies im Browser per Skript zu setzen ist genug? Lass es mich wissen, bitte.
Shasi kanth
45

Der folgende Code erledigt die Aufgabe für die automatische Anmeldung ohne Passwort!

// Automatic login //
$username = "Admin";
$user = get_user_by('login', $username );

// Redirect URL //
if ( !is_wp_error( $user ) )
{
    wp_clear_auth_cookie();
    wp_set_current_user ( $user->ID );
    wp_set_auth_cookie  ( $user->ID );

    $redirect_to = user_admin_url();
    wp_safe_redirect( $redirect_to );
    exit();
}
Sjoerd Linders
quelle
Nun, es funktioniert großartig. Lediglich der Benutzername ist ausreichend, die Groß- und Kleinschreibung spielt keine Rolle.
Shasi kanth
get_user_by()Gibt bei einem Fehler false zurück. Überprüfen Sie daher, ob das WP_Error-Objekt falsch ist
Brian,
@Sjoerd Linders, wo kann ich Ihr Skript einbinden, um die Verbindung eines Benutzers zu erzwingen?
RafaSashi
Wo behalte ich diesen Codeblock in welcher Datei?
sgiri
8

Ich habe hier eine andere Lösung gefunden , die einen besseren Ansatz verwendet (zumindest meiner Meinung nach ...). Sie müssen keine Cookies setzen, es wird die Wordpress-API verwendet:

/**
 * Programmatically logs a user in
 * 
 * @param string $username
 * @return bool True if the login was successful; false if it wasn't
 */
    function programmatic_login( $username ) {
        if ( is_user_logged_in() ) {
            wp_logout();
        }

    add_filter( 'authenticate', 'allow_programmatic_login', 10, 3 );    // hook in earlier than other callbacks to short-circuit them
    $user = wp_signon( array( 'user_login' => $username ) );
    remove_filter( 'authenticate', 'allow_programmatic_login', 10, 3 );

    if ( is_a( $user, 'WP_User' ) ) {
        wp_set_current_user( $user->ID, $user->user_login );

        if ( is_user_logged_in() ) {
            return true;
        }
    }

    return false;
 }

 /**
  * An 'authenticate' filter callback that authenticates the user using only     the username.
  *
  * To avoid potential security vulnerabilities, this should only be used in     the context of a programmatic login,
  * and unhooked immediately after it fires.
  * 
  * @param WP_User $user
  * @param string $username
  * @param string $password
  * @return bool|WP_User a WP_User object if the username matched an existing user, or false if it didn't
  */
 function allow_programmatic_login( $user, $username, $password ) {
    return get_user_by( 'login', $username );
 }

Ich denke, der Code ist selbsterklärend:

Der Filter sucht nach dem WP_User-Objekt für den angegebenen Benutzernamen und gibt es zurück. Ein Aufruf der Funktion wp_set_current_usermit dem von zurückgegebenen WP_User-Objekt wp_signon, eine Überprüfung mit der Funktion is_user_logged_in, um sicherzustellen, dass Sie angemeldet sind, und fertig !

Ein schönes und sauberes Stück Code meiner Meinung nach!

Mike
quelle
wo programmatic_login verwenden?
RafaSashi
Perfekte Antwort!
Maximus
@Shebo Dein Kommentar scheint nicht korrekt zu sein. Die erste Zeile der Funktion prüft, ob das Array $credentialsleer ist oder nicht. Wenn das Array nicht leer ist (was in meiner Antwort der Fall ist), werden die Werte aus dem Array verwendet, um den Benutzer zu authentifizieren.
Mike
@ Mike wow, wie habe ich es verpasst ... Mein schlechtes, sorry für die Irreführung. Ich werde meinen ersten Kommentar löschen, um Verwirrung zu vermeiden. Tolle Lösung :)
Shebo
5

Das funktioniert gut für mich:

  clean_user_cache($user->ID);
  wp_clear_auth_cookie();
  wp_set_current_user($user->ID);
  wp_set_auth_cookie($user->ID, true, false);
  update_user_caches($user);
Paul
quelle
2

Neben Mike, Paul und Sjoerd:

login.phpUmleitungen besser handhaben :

//---------------------Automatic login--------------------

if(!is_user_logged_in()){

    $username = "user1";

    if($user=get_user_by('login',$username)){

        clean_user_cache($user->ID);

        wp_clear_auth_cookie();
        wp_set_current_user( $user->ID );
        wp_set_auth_cookie( $user->ID , true, false);

        update_user_caches($user);

        if(is_user_logged_in()){

            $redirect_to = user_admin_url();
            wp_safe_redirect( $redirect_to );
            exit;
        }
    }
}
elseif('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] == wp_login_url()){

    $redirect_to = user_admin_url();
    wp_safe_redirect( $redirect_to );
    exit;
}

Wird wp-config.phpgleich nachgelegt

require_once(ABSPATH . 'wp-settings.php');

Zu Ihrer Information

Basierend auf der obigen Lösung habe ich ein Plugin veröffentlicht, mit dem der Benutzer von WordPress zu WordPress eingeloggt bleibt, indem Benutzerdaten und Cookie-Sitzung synchronisiert werden:

https://wordpress.org/plugins/user-session-synchronizer/

RafaSashi
quelle