故意强制登录失败的WordPress

时间:2016-07-22 作者:MxmastaMills

我试图强制WordPress登录功能在某些情况下失败。基本上,我们有一种情况,即我们的用户允许他们的帐户在我们的成员环境中过期。这个想法是,如果他们尝试登录,登录就会失败,因为他们无论如何都无法访问任何内容,所以我想我们只是让他们知道一个自定义login_errors 消息

问题是,用户必须有一个登录错误才能做到这一点(这意味着他们必须使用错误的用户名/密码组合)。在这种情况下,他们仍然可以登录,但他们只是没有有效的成员资格来与网站上的内容进行交互。

我正在使用wp_authenticate hook和我能够成功地从登录的用户那里获取信息,但我似乎不能强迫它抛出错误。如果我return falsereturn new WP_Error() 它不起作用。如果我更改流中的凭据,这似乎也无关紧要。

关于如何强制其登录失败并使用新的错误消息重定向到登录页面,您有什么想法吗?

1 个回复
最合适的回答,由SO网友:Andy Macaulay-Brook 整理而成

我上次在网站上这么做已经很久了,但这是要点。

你想加入wp_authenticate_user 它将在WP尝试对用户进行身份验证后但在用户登录之前激发。

您将收到WP_User 对象或aWP_Error 对象,您应该返回WP_User 对象(如果您自己的身份验证检查成功)或WP_Error 对象(如果身份验证失败)。像这样的方法应该会奏效:

function wpse_232915_authenticate_user( $user ) {

    /* already failed login attempt
       return existing error or you\'ll subvert the login process:
    */
    if ( is_wp_error( $user ) ) {
        return $user;
    }

    $failure = your_own_authentication_tests( $user->ID ); // test if the user should be allowed in by your own rules

    if ( $failure ) {
        return new WP_Error( \'wpse_232915_user_expired\', \'Sorry, you have expired!\' );
    }

    return $user;
}

add_filter( \'wp_authenticate_user\', \'wpse_232915_authenticate_user\' );
根据测试的复杂程度,可以从该函数返回WP\\u Error对象,而不是像我在这里假设的那样返回true/false。

我对WP\\u Error还不够熟练,无法知道您是否可以链接错误,或者登录错误通知框是否会对此感到满意,但这是一个值得研究的改进。