如何在登录时不存在角色的情况下为用户分配角色

时间:2019-12-12 作者:markb

我目前有一个WP站点的前端部分,允许管理员创建新用户,然后从下拉列表中分配用户角色,这非常有效。

然而,我正在使用一个插件来根据AD/LDAP对用户进行身份验证,这样我也可以在公司级别上使用它。

问题是,当用户第一次针对LDAP进行身份验证时,没有用户分配,插件中也没有我可以看到的关于如何进行身份验证的位置(使用NextAD plugin).

然而,我看到我可以在登录时对授权进行自定义检查,并认为我可以在那里添加角色:

function mb_authenticate_user( $user ) {
    // get the user id from log in name
    $mb_user_id = get_user_by(\'login\', $_REQUEST[\'log\'] );
    $mb_user_id = $mb_user_id->ID;

    // empty role on login
    if( empty( mb_current_user_role() ) ) {
        wp_update_user( array( \'ID\' => $mb_user_id, \'role\' => \'mbToBeAssigned\' ) );
    }

    // other custom code checks here too

}
add_filter( \'wp_authenticate_user\', \'mb_authenticate_user\',     1       );
add_filter( \'authorize\',            \'mb_authenticate_user\'              ); // plugin authentication NextAD
然而,在我的mb_current_user_role() 作用

function mb_current_user_role( $echo = false ) {
    $user = \'\';
    $user = ( is_user_logged_in() ? array_values( wp_get_current_user()->roles ) : null );
    $user = $user[0];

    if( $echo ) {
        echo $user;
    } else {
        return $user;       
    }
}
它无法正确检查用户是否具有现有角色,并不断使用身份验证角色覆盖这些角色:mbToBeAssigned

我有什么遗漏吗?还是有更好的方法?也在多站点上运行。

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

我认为,它覆盖所有用户的原因是您如何评估用户角色(以及何时评估)。

您正在运行中的用户角色检查mb_current_user_role() 该函数假设用户已登录,否则会设置$user (最初)至null.

但当从mb_authenticate_user() 函数,则用户未登录,因此每次运行时,它都会返回null-无论用户是否具有角色。(希望我解释得足够好,有道理。)

此外,除了WP允许用户使用多个角色(因此使用数组),并且不能保证角色数组只包含一个角色之外,以下行存在问题:

$user = $user[0];

如果用户没有角色,则不会设置索引0。如果您在启用调试模式的情况下运行此程序,我怀疑您会收到关于此问题的PHP通知。

因此,您需要检查该值是否已设置。

我对您的mb_current_user_role() 函数来解决这些问题。首先,它接受两个参数,第一个参数是用户ID,因此您的authenticate函数应该传递用户ID(而不是出于上述原因检查登录的用户)。

function mb_current_user_role( $mb_user_id = false, $echo = false ) {
    $user = ( $mb_user_id ) ? array_values( wp_get_current_user()->roles ) : false;
    $user = ( isset( $user[0] ) ) ? $user[0] : false;

    if( $echo ) {
        echo $user;
    } else {
        return $user;
    }
}
现在,在身份验证函数中,而不是:

if( empty( mb_current_user_role() ) ) {
评估如下:

if ( false === mb_current_user_role( $mb_user_id->ID ) ) {
你可以使用另一个答案的方法mb_current_user_role() 全部,但正在修复mb_current_user_role()\'s问题为您提供了一个可用的实用程序函数,您也可以在其他实例中使用。

SO网友:Reigel

您可以跳过该函数,然后继续检查roles.
请注意,我在这里更改了原始代码中的一些变量。

function mb_authenticate_user( $user ) {
    // get the user id from log in name
    $mb_user = get_user_by(\'login\', $_REQUEST[\'log\'] );
    $mb_user_id = $mb_user->ID;

    // empty role on login
    if( !$mb_user->roles ) {
        wp_update_user( array( \'ID\' => $mb_user_id, \'role\' => \'mbToBeAssigned\' ) );
    }

    // other custom code checks here too

}
add_filter( \'wp_authenticate_user\', \'mb_authenticate_user\',     1       );
add_filter( \'authorize\',            \'mb_authenticate_user\'              ); // plugin authentication NextAD

相关推荐

仅为子网站使用WordPress MultiSite

我目前为多个电子商务商店运行WordPress多站点,主站点设置为example。com和子网站为例。com/子网站1。我是否可以仅对子网站使用multisite,并对主站点运行squarespace或其他Cms?问,因为我希望雇用一位用户体验/图形网页设计师,他在我的登陆/主站点(example.com)使用非wordpress Cms,但将保持我多站点的所有其余部分不变。