如何允许基于包含@字符的登录重置密码?

时间:2019-06-24 作者:mike23

我正在进行一个设置,用户登录必须遵循以下格式:

登录:用户-john@doe.com

尽管Wordpress在创建此类帐户方面没有问题,但它们似乎与“忘记密码”表单的配合不太好:

enter image description here

罪魁祸首在wp-login.php :

function retrieve_password() {
    $errors = new WP_Error();
    if ( empty( $_POST[\'user_login\'] ) || ! is_string( $_POST[\'user_login\'] ) ) {
        $errors->add( \'empty_username\', __( \'<strong>ERROR</strong>: Enter a username or email address.\' ) );
    } elseif ( strpos( $_POST[\'user_login\'], \'@\' ) ) {
        $user_data = get_user_by( \'email\', trim( wp_unslash( $_POST[\'user_login\'] ) ) );
        if ( empty( $user_data ) ) {
            $errors->add( \'invalid_email\', __( \'<strong>ERROR</strong>: There is no account with that username or email address.\' ) );
        }
    } else {
        $login     = trim( $_POST[\'user_login\'] );
        $user_data = get_user_by( \'login\', $login );
    }
特别是这一行:

} elseif ( strpos( $_POST[\'user_login\'], \'@\' ) ) {
当Wordpress在登录名中找到@时,它认为这实际上是电子邮件。

有没有一种方法可以绕过这个问题,而不必修改这个核心文件?

我有两个限制条件,即我无法更改登录格式,用户必须提交其登录信息(由于与此步骤无关的原因,不允许调用电子邮件字段重置密码)

3 个回复
SO网友:Bhupen

为忘记密码创建自定义模板,并使用主题功能将忘记密码页面链接添加到WordPress登录页面。php。请参阅下面给出的代码,并根据需要修改条件。

    <?php 
/*
* Template Name: Forgot Password
*/

global $wpdb;

$error = \'\';
$success = \'\';

// check if we\'re in reset form
if( isset( $_POST[\'action\'] ) && \'reset\' == $_POST[\'action\'] ) 
{
    $user_info = trim($_POST[\'user_login\']);

    $user_by_email = get_user_by( \'email\', $user_info ); 
    $user_by_username = get_user_by( \'login\', $user_info ); 

    if( !empty( $user_by_email ) || !empty( $user_by_username ) ) {
        $valid_user = true;
    } else {
        $valid_user = false;
    }

    if( !$valid_user ) {
        $error = \'There is no user registered with that username or email address.\';
    } else {

        $random_password = wp_generate_password( 12, false );
        $user = get_user_by( \'email\', $email );

        $update_user = wp_update_user( array (
                \'ID\' => $user->ID, 
                \'user_pass\' => $random_password
            )
        );

        // if  update user return true then lets send user an email containing the new password
        if( $update_user ) {
            $to = $email;
            $subject = \'Your new password\';
            $sender = get_option(\'name\');

            $message = \'Your new password is: \'.$random_password;

            $headers[] = \'MIME-Version: 1.0\' . "\\r\\n";
            $headers[] = \'Content-type: text/html; charset=iso-8859-1\' . "\\r\\n";
            $headers[] = "X-Mailer: PHP \\r\\n";
            $headers[] = \'From: \'.$sender.\' < \'.$email.\'>\' . "\\r\\n";

            $mail = wp_mail( $to, $subject, $message, $headers );
            if( $mail )
                $success = \'Check your email address for you new password.\';

        } else {
            $error = \'Oops something went wrong updaing your account.\';
        }

    }

    if( ! empty( $error ) )
        echo \'<div class="message"><p class="error"><strong>ERROR:</strong> \'. $error .\'</p></div>\';

    if( ! empty( $success ) )
        echo \'<div class="error_login"><p class="success">\'. $success .\'</p></div>\';
}
?>


<form method="post">
    <fieldset>
        <p>Please enter your username or email address. You will receive a link to create a new password via email.</p>
        <p><label for="user_login">Username or E-mail:</label>
            <?php $user_login = isset( $_POST[\'user_login\'] ) ? $_POST[\'user_login\'] : \'\'; ?>
            <input type="text" name="user_login" id="user_login" value="<?php echo $user_login; ?>" /></p>
        <p>
            <input type="hidden" name="action" value="reset" />
            <input type="submit" value="Get New Password" class="button" id="submit" />
        </p>
    </fieldset> 
</form> 
并添加下面给出的代码以更改忘记密码页面链接。

add_filter( \'lostpassword_url\', \'my_lost_password_page\', 10, 2 );
function my_lost_password_page( $lostpassword_url, $redirect ) {
    return \'your custom page link\';
}

SO网友:birgire

对于帖子作者,我不建议使用电子邮件地址作为用户名,因为这可能会将电子邮件暴露给公众。

如果user-john@example.com 已撰写任何帖子,可通过以下方式访问作者档案:

https://example.com/author/user-johnexample-com/
或来自重定向,例如:

https://example.com/?author=123
REST API用户端点还为文章作者输出类似的信息。

修改一个重要的部分,如登录流程,还可以引入技术部门,以确保每次核心/主题/插件更新后的安全性和公开性完好无损。

SO网友:Johansson

用户名通常不应包含任何特殊字符,只允许使用字母、数字和下划线(\\u0)。如果登录名包含@,则应将其解释为电子邮件。

我不知道你这是什么意思:

当Wordpress在登录名中找到@时,它认为这实际上是电子邮件。

如果您试图实现自定义登录逻辑,可以创建一个页面,为其分配模板,并使用您自己的代码重置该页面内的密码。完成后,可以使用lostpassword_url 筛选以将用户重定向到此页面以重置其密码。