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

27

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 clair. Est-il possible d’utiliser wp_signon () sans le mot de passe en texte clair?

J'ai trouvé une personne qui affirme avoir effectué cette ici , mais elle n'a pas ne travaille pas pour moi.

MERCI!

    
posée emersonthis 28.05.2012 - 15:13

5 réponses

29

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

    
réponse donnée Milo 28.05.2012 - 15:25
40

Le code suivant fait le travail pour la connexion automatique, sans 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();
}
    
réponse donnée Sjoerd Linders 03.01.2014 - 14:21
6

J'ai trouvé une autre solution ici qui utilise une meilleure approche (du moins dans mon opinion...). 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 propre et agréable à mon avis!

    
réponse donnée Mike 31.07.2014 - 16:56
4

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);
    
réponse donnée Paul 10.06.2015 - 01:25
2

Outre Mike, Paul et Sjoerd:

Pour mieux gérer login.php redirections:

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

À placer dans wp-config.php juste après

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

À titre d'information

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 ses données utilisateur et sa session de cookie:

enlace

    
réponse donnée RafaSashi 31.08.2016 - 19:37

Lire d'autres questions sur les étiquettes