在自定义登录表单中传递凭据以避免“已发送标头”的正确方法

时间:2014-08-31 作者:Nathan Arthur

我正在开发一个自定义登录页面插件。我正在尝试找出如何在不创建“headers ready sent”错误的情况下登录用户。

我在打电话wp_signon 用户直接单击“登录”后,但很快发现这种方法会产生“headers ready sent”错误。我已经转而使用挂钩:

private function attemptLogin() {
    add_action( \'after_setup_theme\', array( $this->Cms, \'authenticateUser\' ), 10, 2 );
    do_action( \'after_setup_theme\', $_POST[\'username\'], $_POST[\'password\'] );
}
但是,正如您可能猜到的,这会产生相同的错误,因为本质上,我仍然在立即执行登录。

如何让钩子按照自己的计划运行以避免错误,同时仍然可以使用用户的凭据?

我已经在谷歌和这个网站上搜索了答案,但都没有找到。我找到的最接近的答案是this, 但我仍然不确定如何在传递用户凭据的同时实现建议。

1 个回复
最合适的回答,由SO网友:Jörn Lund 整理而成

成功登录后wp_signon() 在http响应标头中设置cookie。因此,必须在将任何HTML输出发送到浏览器之前调用它。否则将出现“headers ready sent”(标头已发送)错误。

成功登录后,应重定向用户。否则,呈现页面HTML时将不会显示登录信息。

非常粗略但有效的代码:

// process login requests each time wordpress renders a page. 
function my_custom_login_process() {
    // check if login credentials are present in the current http request
    if ( isset( $_POST[\'user_login\'] ) && isset( $_POST[\'user_password\'] ) ) {
        // try login
        $user = wp_signon( $_POST );

        if ( is_wp_error($user) ) // didn\'t work. Tell the user.
            exit(\'Nope...\');
        else // worked! Get him somewhere.
            wp_redirect( get_bloginfo(\'url\') );
    }
}
add_action(\'after_setup_theme\',\'my_custom_login_process\');
此外,您应该使用nonce保护登录表单,并向上述函数添加nonce验证。最简单的方法是使用wp_nonce_field() 在登录表单中。

已解释的Nonces

[编辑]:ANonce 是唯一的标记,它与表单一起注册。它主要用于确保在接受任何数据进行进一步处理之前,Web服务器已生成表单。管理区域中的所有表单都使用nonce(或至少应该使用)。

在登录过程中,它将针对暴力攻击提供基本保护。(这意味着用包含任意用户名/密码组合的空白POST请求淹没WordPress。)

(顺便说一句:你似乎对挂钩有点误解。你真的不应该注册(do_action()) 然后打钩(do_action()) 具有任意函数参数。其他插件也可能注册了它们的功能。This article 看起来是深入理解的一个很好的起点。)

结束

相关推荐

user login and its profile

我想登录,注销和查看配置文件的功能。我目前能够登录用户并将其重定向到网站主页。我想在菜单和注销链接上显示loggedin用户名。为了获取当前登录用户的用户名,我尝试了以下方法:http://codex.wordpress.org/Function_Reference/wp_get_current_user但无法获取用户名。对于登录/注销链接,我在函数中使用了此代码。phpadd_filter(\'wp_nav_menu_items\', \'add_login_logout_link\', 10, 2);