Puis-je connecter par programme un utilisateur sans mot de passe?

32

Je crée manuellement des utilisateurs par programme et je veux connecter le nouvel utilisateur créé. WP facilite l’accès au mot de passe haché, mais pas à la version en texte clair. Est-il possible d'utiliser wp_signon () sans le mot de passe en texte clair?

J'ai trouvé une personne qui prétend l'avoir faite ici , mais cela n'a pas fonctionné pour moi.

MERCI!

emersonthis
la source
Je pense que vous pouvez simplement affecter l'objet utilisateur de l'utilisateur que vous venez de créer à la variable globale current_user
onetrickpony

Réponses:

32

wp_set_auth_cookie() connectera un utilisateur sans avoir à connaître son mot de passe.

Milo
la source
Cela a très bien fonctionné. Cependant, lorsque je l'utilise, le conditionnel is_user_logged_in()ne semble pas fonctionner. Savez-vous s'il s'agit de quelque chose de différent des cookies?
emersonthis
2
@ Emerson - à quel crochet les connectez-vous? il doit être avant que les en-têtes ne soient envoyés. essayez également de les wp_set_current_useridentifier avant de vous connecter.
Milo
En fait, je ne l'appelais pas du tout. Je viens d'ajouter wp_set_auth_cookie()dans ma fonction de connexion. Je suppose que je dois repenser cela. Je vais aussi rechercher wp_set_current_user et faire rapport. Merci beaucoup pour votre aide!
emersonthis
Eh bien, est-il possible de connecter un utilisateur sans que ses détails existent dans la base de données? Il suffit de définir quelques cookies dans le navigateur via un script? S'il vous plaît, faites-moi savoir.
Shasi Kanth
46

Le code suivant fait le travail pour la connexion automatique, sans aucun mot de passe!

// 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
la source
Cela fonctionne très bien. Le nom d'utilisateur suffit, ce qui est insensible à la casse.
Shasi Kanth
get_user_by()renvoie false en cas d'échec. Vous devez donc rechercher false au lieu de l'objet WP_Error
Brian
@Sjoerd Linders, où puis-je accrocher votre script afin de forcer un utilisateur à se connecter?
RafaSashi
Où dois-je conserver ce bloc de code dans quel fichier?
sgiri
8

J'ai trouvé une autre solution ici qui utilise une meilleure approche (du moins à mon avis ...). Pas besoin de définir de cookie, il utilise l'API Wordpress:

/**
 * 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 );
 }

Je pense que le code est explicite:

Le filtre recherche l'objet WP_User pour le nom d'utilisateur donné et le renvoie. Un appel à la fonction wp_set_current_useravec l'objet WP_User renvoyé par wp_signon, une vérification avec la fonction is_user_logged_inpour vous assurer que vous êtes connecté, et c'est tout!

Un morceau de code propre et agréable à mon avis!

Mike
la source
où utiliser programmatic_login?
RafaSashi
Réponse parfaite!
Maximus
@Shebo Votre commentaire ne semble pas être correct. La première ligne de la fonction vérifie si le tableau $credentialsest vide ou non. Si le tableau n'est pas vide (ce qui est le cas dans ma réponse), les valeurs du tableau sont utilisées pour authentifier l'utilisateur.
Mike
@ Mike wow, comment ai-je raté ça? Mon dieu, désolé d'avoir induit en erreur. Je vais supprimer mon premier commentaire, pour éviter toute confusion. Excellente solution cependant :)
Shebo
5

Cela fonctionne bien pour moi:

  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
la source
2

En plus de Mike, Paul et Sjoerd:

Pour mieux gérer les login.phpredirections:

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

Être placé dans wp-config.php juste après

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

FYI

Basé sur la solution ci-dessus, j'ai publié un plugin pour garder l'utilisateur connecté d'une wordpress à une autre en synchronisant les données de l'utilisateur et la session de cookie:

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

RafaSashi
la source