Aggiungere un campo di autenticazione aggiuntivo nella pagina di login

17 mar 2012, 13:19:43
Visualizzazioni: 15.5K
Voti: 7

Voglio migliorare la pagina di autenticazione del mio WordPress. La mia idea è aggiungere semplicemente un campo extra nella pagina di login. Questo campo aggiuntivo richiederà all'utente di inserire un codice di identificazione personale (da 4 a 8 cifre).

Ho modificato il layout della pagina di login in wp-login.php e aggiunto una colonna extra nel database MySQL per memorizzare il codice di identificazione personale.

Tuttavia, non so quale parte del codice viene utilizzata per verificare la password, poiché vorrei fare riferimento al codice esistente.

Come posso farlo in modo efficace?

0
Tutte le risposte alla domanda 3
1
17

Innanzitutto, ti sconsiglio vivamente di modificare i file core poiché verranno sovrascritti al prossimo aggiornamento di WordPress.

Inoltre, dovresti aggiornare WordPress, perché spesso include aggiornamenti di sicurezza. (Recentemente è stato segnalato che c'è stata un'ondata di attacchi a siti che utilizzavano versioni obsolete di WordPress)

Per ottenere ciò che vuoi fare realmente, ti consiglio di utilizzare gli hook come metodo migliore per modificare WordPress.

Quindi, per creare un campo aggiuntivo nella tua pagina di login, puoi utilizzare l'hook login_form:

add_action('login_form','my_added_login_field');
function my_added_login_field(){
    //Output your HTML
?>
    <p>
        <label for="my_extra_field">Il mio campo aggiuntivo<br>
        <input type="text" tabindex="20" size="20" value="" class="input" id="my_extra_field" name="my_extra_field_name"></label>
    </p>
<?php
}

Ora dobbiamo verificare che ciò che hanno inserito nel campo corrisponda a ciò che hai memorizzato. Nel codice seguente, ho ipotizzato che tu abbia memorizzato il codice di identificazione come valore meta utente con la chiave meta my_ident_code. Dovresti fare questo piuttosto che creare la tua colonna!. Consulta le pagine del Codex per:

Per verificare un utente puoi utilizzare il filtro authenticate. Questo passa il nome utente e la password inseriti. Se il codice di identificazione è corretto, restituisci null per consentire a WordPress di verificare la password e il nome utente. Se non è corretto, rimuovi l'autenticazione di WordPress e restituisci un errore. Questo costringe l'utente a tornare alla pagina di accesso, dove vedrà l'errore visualizzato.

add_filter( 'authenticate', 'my_custom_authenticate', 10, 3 );
function my_custom_authenticate( $user, $username, $password ){
    //Ottieni il valore POSTATO
    $my_value = $_POST['my_extra_field_name'];

    //Ottieni l'oggetto utente
    $user = get_user_by('login', $username );

    //Ottieni il valore memorizzato
        $stored_value = get_user_meta($user->ID, 'my_ident_code', true);

    if(!$user || empty($my_value) || $my_value !=$stored_value){
        //Utente non trovato, o nessun valore inserito o non corrisponde al valore memorizzato - non procedere.
            remove_action('authenticate', 'wp_authenticate_username_password', 20);
            remove_action('authenticate', 'wp_authenticate_email_password', 20); 

        //Crea un errore da restituire all'utente
            return new WP_Error( 'denied', __("<strong>ERRORE</strong>: Il tuo identificatore univoco non era valido.") );
    }

    //Assicurati di restituire null 
    return null;
}
17 mar 2012 13:41:23
Commenti

Peccato che non sia stato contrassegnato come corretto, è una risposta perfettamente spiegata e codificata che funziona al 100%.

Nathan Nathan
4 dic 2020 17:08:56
0

Questa risposta è solo a scopo di riferimento.

Non dovresti modificare i file core di WordPress altrimenti perderai le tue modifiche dopo un aggiornamento.

Di seguito è mostrato come WordPress gestisce il processo di verifica della password di login, come si può vedere alla riga 250 del file /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

Se modificare tutto quel codice ti sembra un po' complicato, c'è un buon plugin per questo:

Cimy Extra Fields

Oppure potresti considerare l'uso di Theme My Login che può fare questo, ma richiede un po' di programmazione. Aggiunge anche molte funzionalità extra. Puoi tranquillamente usare questi due plugin insieme.

17 mar 2012 14:31:04