¿Puedo iniciar sesión programáticamente a un usuario sin contraseña?


32

Estoy creando usuarios manualmente mediante programación, y quiero iniciar sesión en el usuario recién creado. WP facilita el acceso a la contraseña hash, pero no a la versión de texto sin formato. ¿Hay alguna manera de usar wp_signon () sin la contraseña de texto sin formato?

Encontré una persona que dice haber hecho esto aquí , pero no funcionó para mí.

¡GRACIAS!


Creo que puede asignar el objeto de usuario del usuario que acaba de crear a la variable global current_user
— onetrickpony

Respuestas:


32

wp_set_auth_cookie() iniciará sesión en un usuario sin tener que conocer su contraseña.


Esto funcionó muy bien. Sin embargo, cuando lo uso, el condicional is_user_logged_in()no parece funcionar. ¿Sabes si se trata de algo diferente a las cookies?
— Emerson este

2
@Emerson: ¿en qué gancho estás iniciando sesión? Tiene que ser antes de enviar los encabezados. también intente hacerlo wp_set_current_userantes de iniciar sesión.
— Milo

En realidad no estaba llamando desde un gancho en absoluto. Acabo de agregar wp_set_auth_cookie()a mi función de inicio de sesión. Creo que tengo que repensar eso. También buscaré wp_set_current_user e informaré de nuevo. ¡Muchas gracias por tu ayuda en esto!
— Emerson este

Bueno, ¿es posible iniciar sesión en un usuario sin que sus datos existan en la base de datos? ¿Solo basta con configurar algunas cookies en el navegador a través del script? Por favor hagamelo saber.
— shasi kanth

45

¡El siguiente código hace el trabajo para el inicio de sesión automático, sin ninguna contraseña!

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

Bueno, funciona muy bien. Solo el nombre de usuario es suficiente, lo que no distingue entre mayúsculas y minúsculas.
— shasi kanth

get_user_by()devuelve falso en caso de error, por lo que debe verificar falso en lugar del objeto WP_Error
— Brian

@Sjoerd Linders, ¿dónde puedo conectar tu script para forzar a un usuario a conectarse?
— RafaSashi

¿Dónde guardo este bloque de código en qué archivo?
— Sgiri

8

He encontrado otra solución aquí que utiliza un mejor enfoque (al menos en mi opinión ...). No es necesario configurar ninguna cookie, utiliza la API de 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 );
 }

Creo que el código se explica por sí mismo:

El filtro busca el objeto WP_User para el nombre de usuario dado y lo devuelve. Una llamada a la función wp_set_current_usercon el objeto WP_User devuelto por wp_signon, una verificación con la función is_user_logged_inpara asegurarse de que está conectado, ¡y eso es todo!

¡Un código bonito y limpio en mi opinión!


¿Dónde usar programmatic_login?
— RafaSashi

¡Respuesta perfecta!
— Maximus

@Shebo Su comentario no parece ser correcto. La primera línea de la función verifica si la matriz $credentialsestá vacía o no. Si la matriz no está vacía (que es el caso en mi respuesta), los valores de la matriz se utilizan para autenticar al usuario.
— Mike

@ Mike wow, ¿cómo me lo perdí? Lo siento, perdón por engañar. Eliminaré mi primer comentario, para evitar confusiones. Gran solución aunque :)
— Shebo

5

Esto funciona bien para mi:

  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

Además de Mike, Paul y Sjoerd:

Para manejar mejor las login.phpredirecciones:

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

Para ser colocado wp-config.phpjusto después

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

FYI

Basado en la solución anterior, he lanzado un complemento para mantener al usuario conectado de un wordpress a otro sincronizando los datos del usuario y la sesión de cookies:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.