如何阻止某些用户角色访问wp-admin?

时间:2012-09-24 作者:Claire

我确实尝试过使用插件前端用户,但这与某些内容冲突,因为它阻止访问某些前端页面。所以我需要手动设置它,以便任何不是两个用户名(或角色)之一的人都无法访问wp admin。

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

插件基本上只是一个用户能力检查,然后在退出调用中重定向。然后它重定向到请求来自的站点。

<?php
! defined( \'ABSPATH\' ) AND exit;
/* Plugin Name: (#66093) »kaiser« Deny Admin-UI access for certain roles */


function wpse66093_no_admin_access()
{
    // Do not run if the user is logged in and trying to log out
    // This might need one or two more checks.
    // Especially if you have custom login/logout/reset password/etc rules and routes set up.
    if ( 
        ! is_admin()
        || (
            is_user_logged_in()
            && isset( $GLOBALS[\'pagenow\'] ) AND \'wp-login.php\' === $GLOBALS[\'pagenow\']
        )
    ) {
        return;
    }

    $redirect = isset( $_SERVER[\'HTTP_REFERER\'] ) ? $_SERVER[\'HTTP_REFERER\'] : home_url( \'/\' );
    if ( 
        current_user_can( \'CAPABILITY_NAME_HERE\' )
        OR current_user_can( \'CAPABILITY_NAME_HERE\' )
    )
        exit( wp_redirect( $redirect ) );
}
add_action( \'admin_init\', \'wpse66093_no_admin_access\', 100 );
请记住,只能使用默认值(请参见代码中的注释)。自定义登录、注销、注册、密码重置逻辑可能会破坏这一点。

Roles vs. Capabilities: 由于角色名称可以更改,而且角色只是一组功能,因此最好检查功能,而不是角色名称。您可以找到内置角色和功能的列表here. 只需看看最严格的访问是什么,然后搜索匹配的功能。然后在上面分配它。如果角色名称发生更改,则更易于维护。是的,你也可以使用一个角色名,这在WordPress中可以使用,但这个概念会在角色名更改时带来难以追踪的bug。

注意:不要以分层的方式考虑角色。考虑一下会计,您在一些SaaS后端输入其电子邮件地址以接收发票。大多数开发人员都无权访问计费详细信息,会计师也无权访问部署设置或安全凭据。他们有不同的角色名称,具有相同的“高”能力,但用于完全不同的部分。在编写功能检查或向系统添加自定义功能时,请记住此示例。

SO网友:Akshay Agarwal

公认的答案提到了用户角色,但实际上使用了用户能力的功能

以下是用户角色的解决方案

 function wpse66094_no_admin_access() {
    $redirect = isset( $_SERVER[\'HTTP_REFERER\'] ) ? $_SERVER[\'HTTP_REFERER\'] : home_url( \'/\' );
    global $current_user;
    $user_roles = $current_user->roles;
    $user_role = array_shift($user_roles);
    if($user_role === \'YOUR_USER_ROLE_HERE\'){
        exit( wp_redirect( $redirect ) );
    }
 }

add_action( \'admin_init\', \'wpse66094_no_admin_access\', 100 );

SO网友:amarinediary

只是重新审视了这个答案,因为它在很长一段时间内没有更新。年份是2021。

接受的答案是检查当前页面是否为wp-login.phpOR 管理页面WHILE 使用admin_init 胡克,这是胡说八道。

admin_init 初始化管理屏幕或脚本时激发。确实如此NOT 只需在面向用户的管理屏幕上运行即可。它继续运行admin-ajax.phpadmin-post.php

在任何情况下,它都不会在wp-login.php 照现在的样子NOT 管理屏幕。虽然它确实会在ajax请求时触发,因此应该处理这种情况。wp_doing_ajax() 确定当前请求是否为WordPress Ajax请求。

在下面的示例中,我使用delete_posts 允许的用户功能admin, editorauthor 访问Wordpress后端。请参阅Capability vs. Role Table 更具限制性的方法。

作为提醒,这里有默认的Wordpress角色(Summary of Roles):

超级管理员 管理 编辑 著者 贡献者 订阅人

在单站点WordPress安装中,管理员实际上是超级管理员。

我选择使用wp_die() 而不是盲目地重定向用户。wp_die() 提供某种类型的用户登录,因为它会终止Wordpress的执行并显示带有错误消息的HTML页面。同样的方法也可以将用户重定向到404页面。任何能够解释这种情况的东西都比盲目的主页重定向要好。

add_action( \'admin_init\', \'restrict_wpadmin_access\' );
if ( ! function_exists( \'restrict_wpadmin_access\' ) ) {
    function restrict_wpadmin_access() {
        if ( wp_doing_ajax() || current_user_can( \'delete_posts\' ) ) {
            return;
        } else {
            header( \'Refresh: 2; \' . esc_url( home_url() ) );
            $args = array(
                \'back_link\' => true,
            );
            wp_die( \'Restricted access.\', \'Error\', $args );
        };
    };
};
阻止默认重定向到wp-admin.php 登录后,我使用login_redirect 钩子过滤器,用于过滤登录重定向URL。我正在使用将他们重定向到他们自己的个人资料页get_author_posts_url(), 但是你可以很容易地重定向到你想要的任何页面。您还可以根据用户角色有条件地重定向(例如:admin到admin页,rest到profile),所有内容都在CODEX页示例部分进行了解释。

add_filter( \'login_redirect\', \'redirect_user_to_profile_on_login\', 10, 3 );
if ( ! function_exists( \'redirect_user_to_profile_on_login\' ) ) {
    function redirect_user_to_profile_on_login( $redirect_to, $requested_redirect_to, $user ) {
        if ( $user && is_object( $user ) && is_a( $user, \'WP_User\' ) ) {
            $redirect_to = esc_url( get_author_posts_url( $user->ID ) );
        };
        return $redirect_to;
    };
};

SO网友:Carlos B

根据@kaiser提供的答案(谢谢你,顺便说一句),这是我的工作代码,只是在任何情况下有人需要它。它被放置在functions.php 文件

使用的条件是,如果用户can\'t manage_optionsedit_posts.

function wpse66093_no_admin_access() {
    $redirect = home_url( \'/\' );
    if ( ! ( current_user_can( \'manage_options\' ) || current_user_can( \'edit_posts\' ) ) )
        exit( wp_redirect( $redirect ) );
}
add_action( \'admin_init\', \'wpse66093_no_admin_access\', 100 );

SO网友:Garrett Hyder Eclipse Creative

有了@kaiser的回答,我发现您需要在admin\\u init上使用admin\\u菜单挂钩,因为它会在!user\\u can\\u access\\u admin\\u page()签入wp admin/includes/菜单。php否则,如果用户没有对仪表板的“读取”权限,他们只会得到“您没有足够的权限访问此页面”页面而不是被重定向。

SO网友:MarcGuay

如果删除read 角色的功能用户将无法访问仪表板。他们将得到以下错误:

您没有足够的权限访问此管理员页面。

原因:当前用户不具备访问“Dashboard”菜单项所需的“read”功能。

参考号:https://codex.wordpress.org/Roles_and_Capabilities#read

结束