廿八的记录与分享
廿八是个偷懒的搬运工
开小招

WordPress实战教程:用纯代码实现禁止指定用户登录和密码找回功能

作为全球最流行的内容管理系统之一,WordPress提供了强大的功能和灵活性,使得网站建设变得简单而便捷。然而,有时我们可能需要限制某些用户的访问权限,或者禁止他们通过密码找回功能来重置密码。本文将介绍如何使用纯代码实现这些功能,为您的WordPress网站提供更高级的安全保障。

在某些情况下,禁止指定用户登录和禁用密码找回功能可能是必要的。

WordPress实战教程:用纯代码实现禁止指定用户登录和密码找回功能插图

实现方法

下面是使用纯代码实现禁止指定用户登录和禁用密码找回功能的方法:

禁止指定用户登录

WordPress实战教程:用纯代码实现禁止指定用户登录和密码找回功能插图1

我们只需要在当前使用的主题的目录下的 “functions.php” 中加入以下代码即可。

/**
* WordPress 禁止指定用户登录
* https://www.ckzcc.com
*/

// 禁止指定用户登录和访问后台
// 在个人的资料页面添加选项,用于禁止指定用户登录
function wpse_add_user_ban_option( $user ) {
$current_user = wp_get_current_user();
$current_user_id = $current_user->ID;
// 用户不能禁止自己
if ( $current_user_id == $user->ID ) {
return;
}
// 只有管理员以上级别的用户才能禁止其他用户登录
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
?>
<h3><?php esc_html_e( '用户登录设置', 'text-domain' ); ?></h3>
<table class="form-table">
<tr>
<th scope="row"><?php esc_html_e( '禁止登录', 'text-domain' ); ?></th>
<td><label><input name="ban_user" type="checkbox" id="ban_user"
<?php checked( get_user_meta( $user->ID, 'ban_user', true ), true ); ?>>
<?php esc_html_e( '选中禁止该用户登录', 'text-domain' ); ?></label></td>
</tr>
<?php wp_nonce_field( 'save_user_ban_option', 'user_ban_option_nonce' ); ?>
</table>
<?php
}
add_action( 'edit_user_profile', 'wpse_add_user_ban_option' );
add_action( 'show_user_profile', 'wpse_add_user_ban_option' );
// 保存用户禁止登录的选项
function wpse_save_user_ban_option( $user_id ) {
// 验证nonce和权限
if ( ! isset( $_POST['user_ban_option_nonce'] ) || ! wp_verify_nonce( $_POST['user_ban_option_nonce'], 'save_user_ban_option' ) ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
// 用户不能禁止自己
if ( $user_id == get_current_user_id() ) {
return;
}
// 过滤和保存数据
$ban_user = isset( $_POST['ban_user'] ) ? (bool) $_POST['ban_user'] : false;
$ban_user = sanitize_text_field( $ban_user );
update_user_meta( $user_id, 'ban_user', $ban_user );
update_user_meta( $user_id, 'disable_password_reset', $ban_user );
}
add_action( 'personal_options_update', 'wpse_save_user_ban_option' );
add_action( 'edit_user_profile_update', 'wpse_save_user_ban_option' );
// 判断用户是否被禁止登录
function wpse_is_user_banned( $user ) {
return (bool) get_user_meta( $user->ID, 'ban_user', true );
}
// 阻止被禁止用户登录
function wpse_prevent_user_login( $user, $username, $password ) {
// 如果用户被禁止登录,则返回错误提示
if ( wpse_is_user_banned( $user ) ) {
return new WP_Error( 'login_failed', __( '抱歉,该用户违反相关规则,已被永久禁止登录!', 'text-domain' ) );
}
// 使用密码哈希验证
$hashed_password = wp_hash_password( $password );
$check_password = wp_check_password( $password, $hashed_password, $user->ID );
if ( $check_password ) {
return $user;
} else {
return new WP_Error( 'login_failed', __( '用户名或密码错误,请重试!', 'text-domain' ) );
}
}
add_filter( 'authenticate', 'wpse_prevent_user_login', 20, 3 );

如果用户被禁止,则禁止使用密码找回功能

WordPress实战教程:用纯代码实现禁止指定用户登录和密码找回功能插图2

我们只需要在当前使用的主题的目录下的 “functions.php” 中加入以下代码即可。

// 如果用户被禁止,则禁止使用密码找回功能
function wpse_disable_password_reset_for_banned_users( $allow, $user_id ) {
if ( get_user_meta( $user_id, 'ban_user', true ) ) {
return false;
} else {
return $allow;
}
}
add_filter( 'allow_password_reset', 'wpse_disable_password_reset_for_banned_users', 10, 2 );
// 移除用户禁止登录选项时删除元数据
function wpse_delete_user_ban_option( $user_id ) {
delete_user_meta( $user_id, 'ban_user' );
delete_user_meta( $user_id, 'disable_password_reset' );
}
add_action( 'delete_user', 'wpse_delete_user_ban_option' );

总的来说,这段代码的作用是,如果用户被禁止登录,则禁止使用密码找回功能。具体详细地说,这段代码使用的 add_filter() 函数将 wpse_disable_password_reset_for_banned_users() 函数加入到了 allow_password_reset 过滤器中。该函数接受两个参数:$allow 和 $user_id。如果用户被禁止登录,则将 $allow 设置为 false,否则将 $allow 设置为 true。
提醒大家需要注意的是,这段代码应该放在主题的 functions.php 文件中,或者放在一个插件中。

当我们在当前启用的主题上添加了上面的代码后,我们就可以在后台“编辑用户”的菜单里看到我们增加的“禁止用户登录”选项了;选中后,则会禁止该用户登录。

赞赏

开小招

WordPress实战教程:用纯代码实现禁止指定用户登录和密码找回功能
作为全球最流行的内容管理系统之一,WordPress提供了强大的功能和灵活性,使得网站建设变得简单而便捷。然而,有时我们可能需要限制某些用户的访问权限,或者禁止他们通过密码找回功能来…
扫描二维码继续阅读
2023-05-30
近期文章