Verifica del nome utente corretto nel modulo di accesso personalizzato

13 apr 2011, 23:24:15
Visualizzazioni: 30.6K
Voti: 11

Ho utilizzato il tutorial di Jeff Star per creare il mio modulo di accesso personalizzato http://digwp.com/2010/12/login-register-password-code/. Funziona alla perfezione, ma ho un problema. Nel modulo di reimpostazione della password, se qualcuno inserisce il proprio nome utente in modo errato (in modo che non venga verificato), viene reindirizzato alla pagina predefinita wp-login.php?action=lostpassword con il messaggio di errore.

C'è un modo per reindirizzare a una mia pagina di errore personalizzata?

Grazie!

1
Commenti

Di fretta, può username_exists() esserti d'aiuto in qualche modo?

Ashfame Ashfame
13 apr 2011 23:29:41
Tutte le risposte alla domanda 3
8
11

Il codice che ha pubblicato in quel tutorial (molto bello tra l'altro) invia il modulo al modulo integrato di "reimpostazione password" che reindirizza a login.php in caso di errore, ma puoi modificarlo e crearne uno tuo basato sull'originale e aggiungerlo alla pagina del template, cambia:

<form method="post" action="<?php echo site_url('wp-login.php?action=lostpassword', 'login_post') ?>" class="wp-user-form">
    <div class="username">
        <label for="user_login" class="hide"><?php _e('Username or Email'); ?>: </label>
        <input type="text" name="user_login" value="" size="20" id="user_login" tabindex="1001" />
    </div>
    <div class="login_fields">
        <?php do_action('login_form', 'resetpass'); ?>
        <input type="submit" name="user-submit" value="<?php _e('Reset my password'); ?>" class="user-submit" tabindex="1002" />
        <?php $reset = $_GET['reset']; if($reset == true) { echo '<p>A message will be sent to your email address.</p>'; } ?>
        <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>?reset=true" />
        <input type="hidden" name="user-cookie" value="1" />
    </div>
</form>

con:

<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>" class="wp-user-form">
<div class="username">
    <label for="user_login" class="hide"><?php _e('Username or Email'); ?>: </label>
    <input type="text" name="user_login" value="" size="20" id="user_login" tabindex="1001" />
</div>
<div class="login_fields">
    <?php do_action('login_form', 'resetpass'); ?>
    <input type="submit" name="user-submit" value="<?php _e('Reset my password'); ?>" class="user-submit" tabindex="1002" />

    <?php
    if (isset($_POST['reset_pass']))
    {
        global $wpdb;
        $username = trim($_POST['user_login']);
        $user_exists = false;
        if (username_exists($username))
        {
            $user_exists = true;
            $user_data = get_userdatabylogin($username);
        } elseif (email_exists($username))
        {

            $user_exists = true;
            $user = get_user_by_email($username);
        } else
        {
            $error[] = '<p>' . __('Username or Email was not found, try again!') . '</p>';
        }
        if ($user_exists)
        {
            $user_login = $user->user_login;
            $user_email = $user->user_email;
            // Genera qualcosa di casuale per la password... md5 del tempo corrente con un sale random
            $key = substr(md5(uniqid(microtime())), 0, 8);
            // Ora inserisce la nuova password md5 nel database
            $wpdb->query("UPDATE $wpdb->users SET user_activation_key = '$key' WHERE user_login = '$user_login'");
            //crea il messaggio email
            $message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n";
            $message .= get_option('siteurl') . "\r\n\r\n";
            $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
            $message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n";
            $message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key\r\n";
            //invia il messaggio email
            if (FALSE == wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message))
            $error[] = '<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>';
        }
        if (count($error) > 0)
        {
            foreach ($error as $e)
            {
                echo $e . '<br/>';
            }
        } else
        {
            echo '<p>' . __('A message will be sent to your email address.') . '</p>';
        }
    }
    ?> 
    <input type="hidden" name="reset_pass" value="1" />
    <input type="hidden" name="user-cookie" value="1" />
</div>
</form>
14 apr 2011 01:18:01
Commenti

Sembra ottimo, ti farò sapere se funziona.

Pippin Pippin
14 apr 2011 23:28:09

Ok, ho fatto funzionare tutto perfettamente con solo poche modifiche. C'erano un paio di errori di sintassi e il generatore di chiavi md5 non funzionava, quindi ho preso quello da wp-login.php. Ora ho solo un problema. Quando qualcuno clicca sul link nell'email per creare una nuova password, viene reindirizzato al modulo predefinito, quindi ora devo creare un modulo anche per quello.

Pippin Pippin
15 apr 2011 18:17:33

@pippin: il codice del generatore di chiavi md5 qui è quello di wp-login.php, e per quanto riguarda il reindirizzamento prova ad aggiungere &redirect_to=$_SERVER['REQUEST_URI'] al link nell'email che invii.

Bainternet Bainternet
15 apr 2011 19:00:06

Il mio link ora appare così $message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key&login=$user_login&redirect_to=$_SERVER['REQUEST_URI']\r\n";, ma la cosa strana è che quando aggiungo &redirect, il messaggio non viene inviato... Inoltre, non dovrei creare un nuovo modulo per permettere all'utente di inserire la nuova password e così via?

Pippin Pippin
15 apr 2011 20:05:51

Sì, mi ero dimenticato di quello, dovresti creare il tuo modulo per reimpostare la password e probabilmente sostituire il link inviato all'utente con l'URL corrente, e in base alla chiave verificare se è l'utente e mostrargli il modulo.

Bainternet Bainternet
15 apr 2011 22:59:03

riga 17 get_user_by('login', $user_login); dato che get_userdatabylogin è deprecato...

Val Val
15 mag 2012 13:08:14

Mi rendo conto che questa risposta sia piuttosto vecchia, sono un po' insicuro sulla sua affidabilità. Anche se immagino che funzioni, preferirei non pasticciare con SQL poiché potrebbe cambiare in futuro. D'altra parte, non riesco a trovare dettagli su alternative.

Christian Christian
25 feb 2013 10:27:50

"non pasticciare con SQL"? è copiato dal file core nient'altro

Bainternet Bainternet
25 feb 2013 12:08:47
Mostra i restanti 3 commenti
0

Ecco una versione aggiornata del codice di @bainternet con gli errori di sintassi corretti, il suggerimento di @Val e il generatore di chiavi da wp-login.php 3.4.2:

global $wpdb;
$username = trim($_POST['user_login']);
$user_exists = false;
// Prima verifica per username
if ( username_exists( $username ) ){
    $user_exists = true;
    $user = get_user_by('login', $username);
}
// Poi, per indirizzo email
elseif( email_exists($username) ){
        $user_exists = true;
        $user = get_user_by_email($username);
}else{
    $error[] = '<p>'.__('Username o Email non trovati, riprova!').'</p>';
}
if ($user_exists){
    $user_login = $user->user_login;
    $user_email = $user->user_email;

    $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login));
    if ( empty($key) ) {
        // Genera qualcosa di casuale per una chiave...
        $key = wp_generate_password(20, false);
        do_action('retrieve_password_key', $user_login, $key);
        // Ora inserisce la nuova chiave md5 nel database
        $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login));
    }

    //crea il messaggio email
    $message = __('Qualcuno ha richiesto il reset della password per il seguente sito e username.') . "\r\n\r\n";
    $message .= get_option('siteurl') . "\r\n\r\n";
    $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
    $message .= __('Per resettare la password visita il seguente indirizzo, altrimenti ignora questa email e non succederà nulla.') . "\r\n\r\n";
    $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "&redirect_to=".urlencode(get_option('siteurl'))."\r\n";
    //invia il messaggio email
    if (FALSE == wp_mail($user_email, sprintf(__('[%s] Reset Password'), get_option('blogname')), $message))
    $error[] = '<p>' . __('L\'email non può essere inviata.') . "<br />\n" . __('Possibile motivo: il tuo host potrebbe aver disabilitato la funzione mail()...') . '</p>';
}
if (count($error) > 0 ){
    foreach($error as $e){
                echo $e . "<br/>";
            }
}else{
    echo '<p>'.__('Un messaggio verrà inviato al tuo indirizzo email.').'</p>'; 
}
7 dic 2012 20:12:17
1

Continuavo a riscontrare problemi con la chiave di reset che non funzionava correttamente. Il link presente nell'email mi reindirizzava alla pagina standard di reset della password con il parametro nell'URL che indicava un problema con la chiave. Ho quindi analizzato più attentamente il file wp-login.php e incluso correttamente l'oggetto $wp_hasher. Questa modifica ha risolto il problema e ora il reset della password tramite email funziona correttamente.

if (($_SERVER['REQUEST_METHOD'] === (string) 'POST') && (isset($_POST['reset_pass']))) {

// Accesso alle proprietà globali
global $wpdb, $wp_hasher;


// Variabili
$error_pass_reset = array();
$username         = (string) trim($_POST['user_login']);
$user_exists      = (bool)   false;



// ---- VERIFICA ESISTENZA USERNAME O EMAIL ---- //
if (username_exists($username)) {
    $user_exists = (bool)   true;
    $user        = (object) get_user_by('login', $username);
} // end if

else if (email_exists($username)) {
    $user_exists = (bool)   true;
    $user        = (object) get_user_by('email', $username);
} // end else if

else {
    $error_pass_reset[] = '<p>Username o Email non trovati, per favore riprova.</p>';
} // end else



// ---- UTENTE ESISTENTE ---- //
if ($user_exists === (bool) true) {
    // Variabili
    $user_login = (string) $user -> user_login;
    $user_email = (string) $user -> user_email;


    // Genera chiave reset password
if (empty($key)) {
    $key = (string) wp_generate_password(20, false);

    do_action('retrieve_password_key', $user_login, $key);


    // Crea l'oggetto $wp_hasher
    if (empty($wp_hasher)) {
        require_once(ABSPATH . WPINC . '/class-phpass.php');

        $wp_hasher = new PasswordHash(8, true);
    }

    // Reset chiave con hasher applicato (output stringa MD5)
    $hashed = (string) time() . ':' . $wp_hasher -> HashPassword($key);


    // Inserisce la nuova chiave nel database
    $wpdb -> update(
        $wpdb -> users,
        array(
            'user_activation_key' => $hashed
        ),
        array(
            'user_login' => $user_login
        )
    );
} // end if


    // Messaggio email
    $message = (string)
    'Qualcuno ha richiesto il reset della password per il seguente account:' . "\r\n\r\n" .

    get_option('siteurl') . "\r\n\r\n" .

    'Username: ' . $user_login . "\r\n\r\n" .
    'Se questa è stata una richiesta errata, ignora questa email e non succederà nulla.' . "\r\n\r\n" .
    'Per reimpostare la password, visita il seguente indirizzo:' . "\r\n\r\n" .

    get_option('siteurl') . '/wp-login.php?action=rp&key=' . $key . '&login=' . $user_login . "\r\n";


    // Invia email
    if ((bool) false === wp_mail($user_email, get_option('blogname') . ' Reset Password', $message)) {
        $error_pass_reset[] = '<p>L\'email non può essere inviata in questo momento.</p>' . "\n";
    } // end if
} // end if


// Invia l'email di reset password
do_action('login_form', 'resetpass');

} // end if (($_SERVER['REQUEST_METHOD'] === (string) 'POST') && (isset($_POST['reset_pass'])))
13 nov 2015 16:07:59
Commenti

Questa risposta con il codice wp_haser mi è stata estremamente utile poiché ho creato un template personalizzato per il recupero password.

Neelam Khan Neelam Khan
31 gen 2017 17:52:04