Kullanıcıya şifre olmadan programlı olarak giriş yapabilir miyim?


32

Kullanıcıları programlı olarak el ile oluşturuyorum ve yeni oluşturulan kullanıcıya oturum açmak istiyorum. WP, karma şifreye erişmeyi kolaylaştırır ancak düz metin sürümüne erişmez. Düz metin şifresi olmadan wp_signon () kullanmanın bir yolu var mı?

Bunu yapmış iddia bir kişi bulundu burada , ama benim için işe yaramadı.

TEŞEKKÜRLER!


Yeni yarattığınız kullanıcının kullanıcı nesnesini current_user global değişkenine atayabileceğinizi düşünüyorum
onetrickpony

Yanıtlar:


32

wp_set_auth_cookie() Bir kullanıcının şifresini bilmeden giriş yapması.


Bu harika çalıştı. Ancak, kullandığım zaman şartlı is_user_logged_in()işe yaramadı. Kurabiyeden farklı bir şeye bakıyor mu, biliyor musun?
emersonthis

2
@Emerson - Onları hangi kancaya oturtuyorsunuz? Başlıklar gönderilmeden önce olması gerekir. ayrıca wp_set_current_usergiriş yapmadan önce denemeye çalışın .
Milo

Aslında onu bir kancadan çağırmıyordum. Sadece wp_set_auth_cookie()oturum açma işlevime ekledim . Sanırım bunu yeniden düşünmem gerek. Ayrıca wp_set_current_user'ı arayacağım ve rapor edeceğim. Bu konudaki yardımınız için çok teşekkür ederiz!
emersonthis

Peki, bir veriyi veritabanında var olmadan bir kullanıcıya giriş yapmak mümkün mü? Sadece tarayıcıda komut dosyası aracılığıyla birkaç çerez ayarlamak yeterli mi? Lütfen bana haber ver.
shasi kanth

45

Aşağıdaki kod herhangi bir şifre olmadan otomatik oturum açma işini yapar!

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

Harika çalışıyor. Sadece kullanıcı adı yeterlidir; bu durum büyük / küçük harf duyarlı değildir.
shasi kanth

get_user_by()başarısızlık durumunda false döndürür, bu nedenle WP_Error nesnesi yerine false değerini kontrol etmelisiniz
Brian

@Sjoerd Linders, bir kullanıcıyı bağlanmaya zorlamak için betiğinizi nereye bağlayabilirim?
RafaSashi,

Bu kod bloğunu hangi dosyada nerede tutarım?
sgiri

8

Burada daha iyi bir yaklaşım kullanan başka bir çözüm buldum (en azından benim görüşüme göre ...). Herhangi bir çerez ayarlamaya gerek yoktur, Wordpress API'sini kullanır:

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

Kodun açıklayıcı olduğunu düşünüyorum:

Filtre, verilen kullanıcı adı için WP_User nesnesini arar ve onu döndürür. wp_set_current_userWP_User nesnesinin döndürdüğü işleve yapılan bir çağrı , oturum açtığınızdan emin olmak için wp_signonişleve bir göz is_user_logged_inatın ve işte bu kadar!

Bence güzel ve temiz bir kod parçası!


programmatic_login nerede kullanılır?
RafaSashi,

Mükemmel cevap!
Maximus,

@Shebo Yorumunuz doğru görünmüyor. Fonksiyonun ilk satırı dizinin $credentialsboş olup olmadığını kontrol eder . Dizi boş değilse (cevabımdaki gibi), diziden elde edilen değerler kullanıcının kimliğini doğrulamak için kullanılır.
Mike

@ Mike vay, nasıl kaçırdım ... Benim kötü, yanıltıcı için üzgünüm. Kafamı önlemek için ilk yorumumu sileceğim. Yine de harika bir çözüm :)
Shebo

5

Bu benim için iyi çalışıyor:

  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

Mike, Paul ve Sjoerd'a ek olarak:

login.phpYönlendirmeleri daha iyi ele almak için :

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

wp-config.phpHemen sonra yerleştirilmek için

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

Bilginize

Yukarıdaki çözüme dayanarak, kullanıcı verilerini ve çerez oturumunu senkronize ederek kullanıcının bir wordpress'ten diğerine giriş yapmasını sağlamak için bir eklenti yayınladım:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.