Pot conecta programatic un utilizator fără parolă?

28 mai 2012, 16:13:10
Vizualizări: 118K
Voturi: 51

Creez manual utilizatori în mod programatic și vreau să autentific utilizatorul nou creat. WordPress face ușoară accesarea parolei criptate, dar nu și versiunea în text simplu. Există vreo modalitate de a folosi wp_signon() fără parola în text simplu?

Am găsit o persoană care susține că a făcut acest lucru aici, dar nu a funcționat pentru mine.

MULȚUMESC!

1
Comentarii

Cred că poți pur și simplu să atribui obiectul utilizatorului pe care tocmai l-ai creat variabilei globale current_user

onetrickpony onetrickpony
28 mai 2012 16:27:58
Toate răspunsurile la întrebare 7
4
66

Următorul cod realizează autentificarea automată, fără a fi necesară nicio parolă!

// Autentificare automată //
$username = "Admin";
$user = get_user_by('login', $username );

// URL de redirecționare //
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();
}
3 ian. 2014 15:21:12
Comentarii

Funcționează excelent. Este suficient doar numele de utilizator, care nu este sensibil la majuscule.

shasi kanth shasi kanth
6 feb. 2014 09:50:52

get_user_by() returnează false în caz de eșec, așa că ar trebui să verifici pentru false în loc de obiectul WP_Error

somebodysomewhere somebodysomewhere
14 apr. 2016 23:41:21

@Sjoerd Linders, unde pot conecta scriptul tău pentru a forța un utilizator să se conecteze?

RafaSashi RafaSashi
31 aug. 2016 19:45:14

În ce fișier trebuie să pun acest bloc de cod?

sgiri sgiri
28 mai 2019 10:32:51
4
43

wp_set_auth_cookie() va autentifica un utilizator fără a fi nevoie să cunoști parola acestuia.

28 mai 2012 16:25:39
Comentarii

A funcționat perfect. Totuși, când îl folosesc, condiția is_user_logged_in() nu pare să funcționeze. Știi dacă verifică altceva decât cookie-urile?

emersonthis emersonthis
28 mai 2012 16:44:12

@Emerson - pe ce hook îi autentifici? trebuie să fie înainte ca antetele să fie trimise. încearcă și să folosești wp_set_current_user înainte de a-i autentifica.

Milo Milo
28 mai 2012 16:47:31

De fapt, nu am apelat-o dintr-un hook deloc. Doar am adăugat wp_set_auth_cookie() în funcția mea de autentificare. Cred că trebuie să reconsider asta. Voi căuta și despre wp_set_current_user și voi reveni cu rezultatele. Mulțumesc foarte mult pentru ajutor!

emersonthis emersonthis
28 mai 2012 16:59:58

Ei bine, este posibil să autentifici un utilizator fără ca detaliile acestuia să existe în baza de date? Este suficient doar să setezi câteva cookie-uri în browser prin script? Te rog să-mi spui.

shasi kanth shasi kanth
6 feb. 2014 11:10:41
5
15

Am găsit o altă soluție aici care folosește o abordare mai bună (cel puțin în opinia mea...). Nu este nevoie să setați niciun cookie, folosește API-ul WordPress:

/**
 * Autentifică programatic un utilizator
 * 
 * @param string $username
 * @return bool True dacă autentificarea a reușit; false dacă nu
 */
function programmatic_login( $username ) {
    if ( is_user_logged_in() ) {
        wp_logout();
    }

    add_filter( 'authenticate', 'allow_programmatic_login', 10, 3 );    // se atașează mai devreme decât alte callback-uri pentru a le scurcircuita
    $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;
}

/**
 * Un callback pentru filtrul 'authenticate' care autentifică utilizatorul folosind doar numele de utilizator.
 *
 * Pentru a evita potențiale vulnerabilități de securitate, această funcție ar trebui folosită doar în contextul unei autentificări programatice,
 * și detașată imediat după ce este executată.
 * 
 * @param WP_User $user
 * @param string $username
 * @param string $password
 * @return bool|WP_User Un obiect WP_User dacă numele de utilizator corespunde unui utilizator existent, sau false dacă nu
 */
function allow_programmatic_login( $user, $username, $password ) {
    return get_user_by( 'login', $username );
}

Cred că codul se explică de la sine:

Filtrul caută obiectul WP_User pentru numele de utilizator dat și îl returnează. Un apel la funcția wp_set_current_user cu obiectul WP_User returnat de wp_signon, o verificare cu funcția is_user_logged_in pentru a vă asigura că sunteți autentificat, și asta e tot!

O bucată de cod frumoasă și curată, în opinia mea!

31 iul. 2014 17:56:52
Comentarii

unde să folosești programmatic_login?

RafaSashi RafaSashi
31 aug. 2016 19:50:13

Răspuns perfect!

Maximus Maximus
9 iul. 2017 02:05:15

@Shebo Comentariul tău nu pare corect. Prima linie a funcției verifică dacă array-ul $credentials este gol sau nu. Dacă array-ul nu este gol (cazul din răspunsul meu), valorile din array sunt folosite pentru autentificarea utilizatorului.

Mike Mike
4 sept. 2017 12:17:55

@Mike wow, cum am putut să ratez asta... Greșeala mea, îmi cer scuze pentru informația greșită. Voi șterge primul meu comentariu, pentru a evita confuzia. Totuși, soluție grozavă :)

Shebo Shebo
4 sept. 2017 14:49:46

Ar putea fi util să închizi wp_signon() într-un bloc try și să apelezi remove_filter în blocul finally. Acest lucru ar trebui să asigure că filtrul este întotdeauna eliminat.

Leukipp Leukipp
23 iul. 2020 06:35:30
1
10

Acest lucru funcționează bine pentru mine:

  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);
10 iun. 2015 02:25:23
Comentarii

Acest articol util oferă explicații despre motivul pentru care acest lucru este necesar: https://tommcfarlin.com/wordpress-user-caches/

Alex Alex
9 mar. 2023 11:53:13
0

Pe lângă Mike, Paul și Sjoerd:

Pentru a gestiona mai bine redirecționările din login.php:

//---------------------Autentificare automată--------------------

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

De plasat în wp-config.php imediat după

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

Pentru informație

Bazat pe soluția de mai sus, am lansat un plugin pentru a menține utilizatorul autentificat de la un WordPress la altul prin sincronizarea datelor utilizatorului și a sesiunii cookie:

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

31 aug. 2016 20:37:10
1

Destul de ciudat, dar singura modalitate care funcționează pentru mine este dacă fac o redirecționare și apoi die():

clean_user_cache($user->ID);
wp_clear_auth_cookie();
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id, true, true );
update_user_caches( $user );

if ( is_user_logged_in() ) {

    $redirect_to = $_SERVER['REQUEST_URI'];
    header("location:".$redirect_to );
    die(); 

}
22 mai 2020 08:36:01
Comentarii

Puteți seta variabila $redirect_to către orice pagină existentă din site. De exemplu: $redirect_to = site_url();

Marcelo Viana Marcelo Viana
25 feb. 2021 19:32:14
0

Cred că acesta este drumul corect. Ar trebui să curățăm cache-ul și cookie-urile utilizatorului. După autentificare, trebuie să declanșăm hook-ul wp_login pentru a permite altor pluginuri și funcții de bază să lucreze împreună.

$user = get_user_by( 'ID', $user_id ); // Obține WP_User din ID-ul utilizatorului.
// $user = get_user_by( 'email', $email ); // Sau obține din email.
// $user = get_user_by( 'login', $username ); // Sau obține din numele de utilizator.

if ( false !== $user ) {
    clean_user_cache( $user->ID );
    wp_clear_auth_cookie();
    wp_set_current_user( $user->ID, $user->user_login );
    wp_set_auth_cookie( $user->ID );
    update_user_caches( $user );
    do_action( 'wp_login', $user->user_login, $user );
}
13 ian. 2024 16:56:10