Adăugarea unui câmp suplimentar de autentificare în pagina de login

17 mar. 2012, 13:19:43
Vizualizări: 15.5K
Voturi: 7

Vreau să îmbunătățesc pagina de autentificare WordPress. Ideea mea este să adaug un câmp suplimentar în pagina de login. Acest câmp va cere utilizatorului să introducă un cod personal de identificare (4 până la 8 cifre).

Am modificat layout-ul paginii de login în wp-login.php și am adăugat o coloană suplimentară în baza de date MySQL pentru a stoca codul personal de identificare.

Totuși, nu știu care parte din cod este folosită pentru verificarea parolei, deoarece vreau să mă refer la codul existent.

Cum pot face acest lucru eficient?

0
Toate răspunsurile la întrebare 3
1
17

În primul rând, aș sfătui să evitați editarea fișierelor de bază deoarece acestea vor fi suprascrise la următoarea actualizare WordPress.

De asemenea, ar trebui să actualizați WordPress, deoarece adesea includ actualizări de securitate. (Recent s-a raportat că au existat o serie de atacuri asupra site-urilor care folosesc versiuni învechite de WordPress)

Pentru a realiza ceea ce doriți de fapt, vă recomand să folosiți hooks ca fiind cea mai bună metodă de a edita WordPress.

Astfel, pentru a adăuga un câmp suplimentar pe pagina de autentificare, puteți utiliza hook-ul de acțiune login_form:

add_action('login_form','my_added_login_field');
function my_added_login_field(){
    //Afișează HTML-ul tău
?>
    <p>
        <label for="my_extra_field">Câmpul meu suplimentar<br>
        <input type="text" tabindex="20" size="20" value="" class="input" id="my_extra_field" name="my_extra_field_name"></label>
    </p>
<?php
}

În continuare, trebuie să verificăm dacă ceea ce au introdus în câmp se potrivește cu ceea ce aveți stocat. În codul următor, am presupus că ați stocat codul de identificare ca o valoare meta a utilizatorului cu cheia meta my_ident_code. Ar trebui să faceți acest lucru în loc să creați propria coloană!. Consultați paginile Codex pentru

Pentru a verifica utilizatorii, puteți utiliza filtrul authenticate. Acesta transmite numele de utilizator și parola introduse. Dacă codul de identificare este corect, returnați null pentru a permite WordPress să verifice parola și numele de utilizator. Dacă nu este corect, eliminați autentificarea WordPress și returnați o eroare. Acest lucru forțează utilizatorul să revină la pagina de autentificare, unde va vedea eroarea afișată.

add_filter( 'authenticate', 'my_custom_authenticate', 10, 3 );
function my_custom_authenticate( $user, $username, $password ){
    //Obține valoarea POSTATĂ
    $my_value = $_POST['my_extra_field_name'];

    //Obține obiectul utilizator
    $user = get_user_by('login', $username );

    //Obține valoarea stocată
        $stored_value = get_user_meta($user->ID, 'my_ident_code', true);

    if(!$user || empty($my_value) || $my_value !=$stored_value){
        //Utilizatorul nu a fost găsit, sau nu a fost introdusă nicio valoare sau nu se potrivește cu valoarea stocată - nu continua.
            remove_action('authenticate', 'wp_authenticate_username_password', 20);
            remove_action('authenticate', 'wp_authenticate_email_password', 20); 

        //Creează o eroare pentru a o returna utilizatorului
            return new WP_Error( 'denied', __("<strong>EROARE</strong>: Identificatorul dvs. unic a fost invalid.") );
    }

    //Asigură-te că returnezi null 
    return null;
}
17 mar. 2012 13:41:23
Comentarii

Păcat că nu a fost marcată ca fiind corectă, deoarece este un răspuns perfect explicat și codat care funcționează 100%.

Nathan Nathan
4 dec. 2020 17:08:56
0

Acest răspuns este doar în scop de referință.

Nu ar trebui să editați fișierele de nucleu WordPress, altfel veți pierde modificările după o actualizare.

Mai jos este prezentat modul în care WordPress gestionează procesul de verificare a parolei de autentificare, așa cum se poate vedea la linia 250 din fișierul /wp-includes/class-phpass.php:

function CheckPassword($password, $stored_hash)
{
    $hash = $this->crypt_private($password, $stored_hash);
    if ($hash[0] == '*')
        $hash = crypt($password, $stored_hash);

    return $hash == $stored_hash;
}
17 mar. 2012 13:30:44
0

Dacă editarea întregului cod ți se pare puțin descurajantă, există un plugin bun pentru asta:

Cimy Extra Fields

Sau ai putea lua în considerare folosirea Theme My Login care poate face asta, dar necesită puțin codare. De asemenea, adaugă o serie de funcționalități suplimentare. Poți folosi aceste două plugin-uri împreună fără probleme.

17 mar. 2012 14:31:04