web-dev-qa-db-fra.com

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

Je crée manuellement des utilisateurs par programme et je souhaite connecter le nouvel utilisateur créé. WP facilite l'accès au mot de passe haché, mais pas à la version en texte brut. 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 fait ici , mais cela n'a pas fonctionné pour moi.

MERCI!

29
emersonthis

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

31
Milo

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

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_user avec l'objet WP_User renvoyé par wp_signon, une vérification avec la fonction is_user_logged_in pour vous assurer que vous êtes connecté, et c'est tout!

Un morceau de code gentil et propre à mon avis!

7
Mike

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

En plus de Mike, Paul et Sjoerd:

Pour mieux gérer les redirections login.php:

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

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

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

FYI

Sur la base de la solution ci-dessus, j'ai publié un plug-in permettant de 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/

2
RafaSashi