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!


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.


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

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!


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

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/

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.