Bisakah saya secara terprogram login pengguna tanpa kata sandi?

32

Saya secara manual membuat pengguna secara terprogram, dan saya ingin masuk ke pengguna yang baru dibuat. WP membuatnya mudah untuk mengakses kata sandi hash, tetapi bukan versi plaintext. Apakah ada cara untuk menggunakan wp_signon () tanpa kata sandi plaintext?

Saya menemukan satu orang yang mengaku telah melakukan ini di sini , tetapi tidak berhasil bagi saya.

TERIMA KASIH!

emersonthis
sumber
Saya pikir Anda bisa menetapkan objek pengguna dari pengguna yang baru saja Anda buat ke variabel global current_user
onetrickpony

Jawaban:

32

wp_set_auth_cookie() akan login pengguna tanpa harus tahu kata sandi mereka.

Milo
sumber
Ini bekerja dengan baik. Namun, ketika saya menggunakannya, kondisional is_user_logged_in()sepertinya tidak berfungsi. Apakah Anda tahu jika itu melihat sesuatu yang berbeda dari cookie?
emersonthis
2
@Emerson - kait apa yang Anda gunakan? harus sebelum header dikirim. juga coba wp_set_current_usersebelum masuk.
Milo
Aku sebenarnya tidak memanggilnya dari kait sama sekali. Saya baru saja menambahkan wp_set_auth_cookie()fungsi masuk saya. Saya kira saya perlu memikirkan kembali itu. Saya juga akan mencari wp_set_current_user dan melaporkan kembali. Terima kasih banyak atas bantuannya!
emersonthis
Nah, apakah mungkin untuk login pengguna tanpa ada detailnya di database? Hanya mengatur beberapa cookie di browser melalui skrip sudah cukup? Tolong beritahu saya.
shasi kanth
45

Kode berikut berfungsi untuk login otomatis, tanpa kata sandi!

// 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
sumber
Ya, itu bekerja dengan baik. Hanya nama pengguna saja yang cukup, yang tidak sensitif huruf.
shasi kanth
get_user_by()mengembalikan false saat gagal, jadi Anda harus memeriksa false sebagai ganti objek WP_Error
Brian
@ Sojerd Linders, di mana saya dapat mengaitkan skrip Anda untuk memaksa pengguna agar terhubung?
RafaSashi
Di mana saya menyimpan blok kode ini di file mana?
sgiri
8

Saya telah menemukan solusi lain di sini yang menggunakan pendekatan yang lebih baik (setidaknya menurut saya ...). Tidak perlu mengatur cookie apa pun, itu menggunakan 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 );
 }

Saya pikir kode ini cukup jelas:

Filter mencari objek WP_User untuk nama pengguna yang diberikan dan mengembalikannya. Panggilan ke fungsi wp_set_current_userdengan objek WP_User dikembalikan oleh wp_signon, centang dengan fungsi is_user_logged_inuntuk memastikan Anda masuk, dan hanya itu!

Sepotong kode yang bagus dan bersih menurut saya!

Mike
sumber
di mana harus menggunakan programmatic_login?
RafaSashi
Jawaban sempurna!
Maximus
@ Shebo Komentar Anda sepertinya tidak benar. Baris pertama dari fungsi memeriksa apakah array $credentialskosong atau tidak. Jika array tidak kosong (yang merupakan kasus dalam jawaban saya), nilai-nilai dari array digunakan untuk mengotentikasi pengguna.
Mike
@ Mike wow, bagaimana saya melewatkannya ... Maaf, maaf karena menyesatkan. Saya akan menghapus komentar pertama saya, untuk menghindari kebingungan. Solusi hebat :)
Shebo
5

Ini bekerja dengan baik untuk saya:

  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
sumber
2

Selain Mike, Paul dan Sjoerd:

Untuk menangani login.phppengalihan dengan lebih baik :

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

Untuk ditempatkan wp-config.phptepat setelah

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

FYI

Berdasarkan solusi di atas, saya telah merilis sebuah plugin untuk menjaga pengguna tetap masuk dari satu wordpress ke yang lain dengan menyinkronkan data pengguna dan sesi cookie:

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

RafaSashi
sumber