什么时候可以安全地`wp_set_auth_cookie`?

时间:2020-01-17 作者:Daniel M

我构建了一个基于用户ID登录用户的小而有效的代码:

$user_to_login = get_user_by( \'id\', 1 );

// Check if user exists
if( $user_to_login ) {
    wp_set_auth_cookie( $user_to_login->ID, False );

    /**
     * Fire up the login process.
     */
    do_action(\'wp_login\', $user_to_login->name, $user_to_login );
}
我打开这个init:10 但我心里想:“嗯,很多插件实际上都是从这里开始的,可能已经有依赖于用户对象的进程了。”。何时启动此功能是安全/良好的?

1 个回复
最合适的回答,由SO网友:Adam 整理而成

如果请求在输入时未经过身份验证init 如果愿意,可以运行身份验证逻辑。

如果您想留意其他插件,可以运行init 优先权为0 例如(或负值)。

插件(可能)钩住init 以默认优先级或高于默认优先级的优先级和/或其他挂钩。

你不会抓住所有的边缘案例。

记住,设置wp_set_auth_cookie 光靠自己可能还不够。

另一种选择是plugins_loaded.

这个(plugins_loaded) 是该方法is_user_logged_in 变为可用。

内部is_user_logged_in 如下所示:

   function is_user_logged_in() {
       $user = wp_get_current_user();

       return $user->exists();
   }
我解释了wp_get_current_user 以下内容:

全局用户对象global $current_user 在之前首次填充init.

特别是在wp-settings.php:


/**
 * Fires after the theme is loaded.
 *
 * @since 3.0.0
 */
do_action( \'after_setup_theme\' );

// Set up current user.
$GLOBALS[\'wp\']->init();

/**
 * Fires after WordPress has finished loading but before any headers are sent.
 *
 * Most of WP is loaded at this stage, and the user is authenticated. WP continues
 * to load on the {@see \'init\'} hook that follows (e.g. widgets), and many plugins instantiate
 * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.).
 *
 * If you wish to plug an action once WP is loaded, use the {@see \'wp_loaded\'} hook below.
 *
 * @since 1.5.0
 */
do_action( \'init\' );

  • $GLOBALS[\'wp\']->init(); 呼叫WP::init 哪个呼叫wp_get_current_user 哪个呼叫_wp_get_current_user.

  • _wp_get_current_user 填充global $current_user.

  • _wp_get_current_user 启动过滤器determine_current_user.

function _wp_get_current_user() {

    // ... shortened for brevity

    $user_id = apply_filters( \'determine_current_user\', false );
    if ( ! $user_id ) {
        wp_set_current_user( 0 );
        return $current_user;
    }

    wp_set_current_user( $user_id );

    return $current_user;
}
有两个默认(核心)回调连接到determine_current_user:

add_filter( \'determine_current_user\', \'wp_validate_auth_cookie\' );
add_filter( \'determine_current_user\', \'wp_validate_logged_in_cookie\', 20 );
这基本上就是验证用户身份验证有效性的方法,如果有效,determine_current_user 将返回最终传递给的相应用户IDwp_set_current_user( $user_id ).

因此,你最好还是plugins_loaded:

function wpse_356655_custom_auth_callback() {

    // ... shortened for brevity

    $user_to_login = \'...\';

    wp_set_auth_cookie( $user_to_login->ID, true );

    // if you want is_user_logged_in to work you should set `wp_set_current_user` explicityly
    wp_set_current_user( $user_to_login->ID );

    do_action(\'wp_login\', $user_to_login->name, $user_to_login );

}

add_action( \'plugins_loaded\', \'wpse_356655_custom_auth_callback\' );
您还可以进一步了解wp_signon 核心功能,也可能适合您的需要。

更新与您的comment here

我不能说这是最好的办法,但它是可行的。

function wpse_356655_custom_auth_callback() {

    // ... shortened for brevity

    $user_to_login = \'...\';

    wp_set_auth_cookie( $user_to_login->ID, true );

    // if you want is_user_logged_in to work you should set `wp_set_current_user` explicityly
    wp_set_current_user( $user_to_login->ID );

    // from within this callback, hook on to `init`
    add_action(\'init\', function() use($user_to_login) {

        do_action(\'wp_login\', $user_to_login->name, $user_to_login );

    });

}

add_action( \'plugins_loaded\', \'wpse_356655_custom_auth_callback\' );

相关推荐

样式重置密码页面?/wp-login.php?action=rp

我不知道如何设置重置密码页面的样式。我不是指你请求它的页面,我是指当你点击电子邮件中的链接设置新密码时显示的页面。URL为/wp-login.php?action=rp看起来像这样和确认页:如何加载这些的自定义样式?