我正在开发一个WordPress插件,它会在登录表单中添加一个身份验证代码。
这是检查身份验证代码是否有效的过程:
add_action( 'wp_authenticate', 'authcode_check', 5 );
function authcode_check($username) {
$options = get_option( 'authcode_settings' );
if(!empty($options['code'])) {
global $wpdb;
if ( !username_exists( $username ) ) {
return;
}
$set_code = $options['code'];
$submit_code = $_POST['auth_key'];
if(empty($submit_code)) {
add_filter( 'login_errors', function( $error ) {$error = '<strong>ERROR</strong>: Authentication code cannot be empty.';return $error;} );
return;
} elseif ( ! ( $set_code == $submit_code ) ) {
add_filter( 'login_errors', function( $error ) {$error = '<strong>ERROR</strong>: Authentication code is invalid.';return $error;} );
return;
}
}
}
问题是;当用户正确输入他们的WordPress名称和密码,而不是auth代码时,表单仍然会提交并登录用户。
我尝试了return false
,但这没有用。
有没有办法阻止表单在输入错误的身份验证代码时记录用户?
答案 0 :(得分:1)
而不是return false
使用return
显然WordPress更喜欢它,看看它刚刚返回的现有用户名代码,而不是false,不是true,只返回
同时在返回语句之前放置添加过滤器函数,因为返回表示代码在该点停止运行,不再执行任何操作,因此除非您移动它们否则不会出现过滤器
答案 1 :(得分:1)
与@ J.Doe
聊天后更新我们可以挂钩/**
* 'Authentication Code' Input
*/
add_action( 'login_form', function()
{
// Fetch the stored code
$options = get_option( 'authcode_settings' );
// Display code input
if( isset( $options['code'] ) )
printf(
'<p class="login-authenticate">
<label for="auth_key">%s</label>
<input type="text" name="so38551606_auth_key" id="so38551606_auth_key"
class="input" value="" size="20" autocomplete="off" />
</p>',
esc_html__( 'Authentication Code', 'mydomain' )
);
} );
钩子,显示身份验证码的输入:
authenticate
您可以在wp_authenticate()
函数中挂钩/**
* Validate 'Authentication Code' Input
*/
add_filter( 'authenticate', function( $user )
{
// Fetch stored code value
$options = get_option( 'authcode_settings' );
// Nothing to do if there's no stored code value
if( ! isset( $options['code'] ) )
return $user;
// Fetch the user's code input
$submit_code = isset( $_POST['so38551606_auth_key'] )
? $_POST['so38551606_auth_key']
: null;
// Validation's logic
$is_valid_auth_code = ! is_null( $submit_code )
&& ( $options['code'] === $submit_code );
// Valid auth code
if( $is_valid_auth_code )
return $user;
// Add an unvalid auth code error
if( is_wp_error( $user ) )
$user->add(
'invalid_auth_code',
sprintf(
'<strong>%s</strong>: %s',
esc_html__( 'ERROR', 'mydomain' ),
esc_html__( 'Authentication code is invalid.', 'mydomain' )
)
);
// Create a new auth code error
else
$user = new WP_Error(
'invalid_auth_code',
sprintf(
'<strong>%s</strong>: %s',
esc_html__( 'ERROR', 'mydomain' ),
esc_html__( 'Authentication code is invalid.', 'mydomain' )
)
);
return $user;
}, 100 );
过滤器,以获取验证部分:
100
这里我们使用add_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
add_filter( 'authenticate', 'wp_authenticate_email_password', 20, 3 );
add_filter( 'authenticate', 'wp_authenticate_spam_check', 99 );
的优先级,因为我们想在默认回调之后运行它:
so38551606_
我们将POST变量加上Unsupported URL protocol
作为前缀,以避免可能的名称冲突。
输出示例:
答案 2 :(得分:0)
您能证明用户没有登录吗?或者您只是假设他们正在登录,因为错误消息没有显示?
return
关键字之后的任何内容都无法运行。因此,在if语句中,如果auth键不匹配,则会有两个return false;
,然后您将调用一个函数。此功能不会运行,因此不会显示错误代码。
然而,你可以做的是将函数移到return关键字之上。然后它将显示错误并返回false。