当前位置: 首页 > 知识库问答 >
问题:

仅允许特定用户角色登录WordPress站点

卢阳泽
2023-03-14

我目前有一个WP站点设置,安装了一个独特的“multisite”插件,专门用于WooCommerce产品的一个管理区域,但有两个不同的前端,基于两个不同的域,具有不同的主题。

其中一个站点是“批发”站点,而另一个是“零售”站点。批发网站只允许交易客户进行购买。问题在于这两个站点共享一个域,因此用户帐户。

问题:我需要确保,如果没有用户角色“trade_customer”的用户尝试登录批发网站,则会选中该角色并注销该用户,并将其重定向到带有通知的登录页面。到目前为止,我有以下函数。php:

function trade_customers_only() {
    function get_user_role() {
    global $current_user;

    $user_roles = $current_user->roles;
    $user_role = array_shift($user_roles);

    return $user_role;
}

$the_current_role = get_user_role();
echo $the_current_role;
    if( $the_current_role != 'administrator' ) {
       $logout_url = wp_login_url().'?mode=tradeonly';
       wp_destroy_current_session();
       wp_logout();
       wp_redirect( $logout_url, 302 );
       exit();
    }     
}
 add_action('wp_login', 'trade_customers_only');

// CUSTOM LOGIN MESSAGES
function my_login_message() {

    if( $_GET['mode'] == 'tradeonly' ){
        $message = '<p class="message"><b>You must be a Trade Customer to access this site.</b></p>';
        return $message;
    }

}
 add_filter('login_message', 'my_login_message');

此代码当前为:将登录用户返回到wp登录。php并添加注释“您必须是贸易客户…等等”。但是,在使用任何用户角色进行第一次登录尝试后,每一次其他登录尝试都会执行相同的重定向并显示消息。我的代码是否不正确,或者数据库或浏览器中是否存在导致WP认为我没有使用管理员帐户的问题的WP会话cookie?

我第一次尝试登录是使用管理员帐户。它工作了,并转到仪表板。下一次尝试是使用客户角色帐户。发生重定向和注释错误。以下使用管理员帐户的尝试仅使用Notes重定向,但没有仪表板访问权限。

共有3个答案

陆正德
2023-03-14

我已经测试了以下代码是否正常工作。

无需运行wp\u destroy\u current\u session()wp\u logout(),只需返回一个错误,它将中断身份验证并在登录页面上显示错误消息。

您可能必须确保优先级是最后一个(在本例中为100),以便在用户完全登录之前,现有过滤器wp\u authenticate\u username\u passwordwp\u authenticate\u email\u passwordwp\u authenticate\u spam\u check都会执行它们的操作,然后拒绝。

/* Only allow administrators to login */
add_filter( 'authenticate', 'my_admin_check', 100, 1 );

function my_admin_check( $user ) {
    // Make sure this is a real login attempt, without errors
    if ( !is_wp_error($user) ) {
        $user_role = $user->roles[0];
        // add or remove the roles you want to allow/disallow (can be a custom role or regular WordPress roles)
        if ( !in_array( $user_role, array( 'trade_customer' ) ) ){
            return new WP_Error( 'login_failed', __( "Only staff can use this login.", "mysite_domain" ) );
        } else {
            // allow the login
            return $user;   
        }
    } else {
        // We're just loading the login page, not running a login.
        return $user;       
    }
}   
袁秦迟
2023-03-14

我的新完整代码现在是:

function trade_customers_only($login, $user) {
    if( $user->roles && !in_array('administrator',$user->roles)) {
        $logout_url = wp_login_url().'?mode=tradeonly';
        wp_destroy_current_session();
        wp_logout();
        wp_redirect( $logout_url, 302 );
        exit();
    }
}
 add_action('wp_login', 'trade_customers_only',10,2);

// CUSTOM LOGIN MESSAGES
function my_login_message() {

    if( $_GET['mode'] == 'tradeonly' ){
        $message = '<p class="message"><b>You must be a Trade Customer to access this site.</b></p>';
        return $message;
    }

}
 add_filter('login_message', 'my_login_message');

此代码工作正常。然而,正如Kulivov Sergey在他的回复中提到的,使用authenticate过滤器而不是wp_登录操作更适合我需要实现的功能。使用:

add_filter('authenticate',function($user,$username) {
    if (!is_wp_error($user)) {
        $auth_user=get_user_by('login',$username);
        if ($auth_user && !in_array('administrator',$auth_user->roles)) {
            return new WP_Error('authentication_failed', '<p class="message"><b>You must be a Trade Customer to access this site.</b></p>');
        }
    }
    return $user;
},100,2);

不仅可以在不登录和创建会话的情况下检查用户角色,还可以让用户保持在当前页面上,而无需重定向,这非常好。

解飞语
2023-03-14

1)更改trade_customers_only功能:

function trade_customers_only($login, $user) {
    if( $user->roles && !in_array('administrator',$user->roles)) {
        $logout_url = wp_login_url().'?mode=tradeonly';
        wp_destroy_current_session();
        wp_logout();
        wp_redirect( $logout_url, 302 );
        exit();
    }
}

并修复您的行动电话:

add_action('wp_login', 'trade_customers_only',10,2);    

2) 另一种解决方案是使用身份验证过滤器,而不是使用wp_登录操作。区别在于,在设置用户会话之前检查用户的角色,因此不需要销毁它。

add_filter('authenticate',function($user,$username) {
    if (!is_wp_error($user)) {
        $auth_user=get_user_by('login',$username);
        if ($auth_user && !in_array('administrator',$auth_user->roles)) {
            return new WP_Error('authentication_failed', '<p class="message"><b>You must be a Trade Customer to access Key Essentials. Are you looking for <a href="https://lovetillys.co.uk" title="Love Tillys">Love Tillys?</a></b></p>');
        }
    }
    return $user;
},100,2);
 类似资料:
  • 现在,我只想让那些已经注册并用我们的软件验证过的用户登录,我已经将用户的电子邮件列表(去掉特殊字符)保存在Firebase内部。当前,当用户登录时,我使用以下功能检查他们的邮件是否在此列表中: 虽然这种方法起作用,但它相当笨拙,因为用户仍然能够在函数回调被调用之前进行初始登录,并且他们的电子邮件仍然显示在FireBase中的“Authentication”选项卡中。 有没有更好的方法只允许预先验证

  • 登录帧 菜单框架

  • 我想配置一个cassandra角色/用户,该角色/用户只登录并“查看”特定的键空间/表。 以下是我的测试设置: 现在,我的角色“role_test”只能查询keypace“keyspace_test”,而不能查询其他键空间,这没关系,但是“role_test”可以登录并描述其他键空间,尽管它不能做任何事情,我真的想阻止这种情况。 有什么建议吗?

  • 用户已作为用户角色登录,我想以员工身份登录而不提交登录表单,但身份验证失败, 请查一下密码,帮帮我 @requestmapping(value=“/home”)public ModelAndView userHomePage(Model Model,HttpServletRequest request,HttpServletResponse response,Principal Principal

  • 我正在使用FireBase实时数据库来设置一个简单的CRUD应用程序。 我正在设置规则,以便只有登录的用户才能写入请求部分。我一定是误会了奥特。uid。 在请求中,我设置了,但我无法写入数据。 我错过了什么?

  • 问题内容: 在MySQL中,我有一个用户芒果。当我创建它时,用户可以完美地工作。但是,重新启动计算机后,尝试登录芒果会产生以下输出: 这让我想起了密码哈希,因此在调查mysql.user之后,我发现mangos没有密码!我更新了密码: 现在,我得到: 与mangos的mysql.user密码栏中显示的数字相同,并且与原始数字不同。我仍然无法登录。 如何使MySQL正确识别密码? 这就是这里的问题吗