Перевірте, чи є у користувача роль


46

Як я можу перевірити, чи користувач виконує певну роль?

Я знайшов це, але це для Drupal 6.

Відповіді:


87

Оскільки ви вже знайшли цю публікацію , обов’язково прочитайте коментарі. Це чітко пояснює, чому рекомендується перевіряти дозвіл на перевірку ролі. Використовуючи дозволи, ви можете призначити цей дозвіл декільком ролям, що робить вашу систему більш гнучкою. Також пам’ятайте, що ролі можуть бути перейменовані, що порушить ваш код.

Це означає, що якщо ви хочете перевірити роль, ви можете зробити це:

// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role.
if (in_array('editor', $user->roles)) {
  // do fancy stuff
}

1
Що робити, якщо я хочу перевірити більше 1 ролі. Наприклад, якщо "редактор" чи "видавець", ніж робити фантазії. Як кодувати. Pls радимо. Не можу зрозуміти насправді.
Адамтан

8
Будь ласка, прочитайте відповідь: не рекомендується перевіряти на роль (або декілька). Перевірте, чи немає дозволів. Решта вашого запитання (поєднуючи дві умови у if-заяві) - це базовий PHP, нічого не стосується Drupal. Прочитайте документацію PHP на логічних операторах .
marcvangend

11

Щоб перевірити, чи є у поточного користувача одну роль чи якусь із кількох ролей, чудовим способом є:

//can be used in access callback too
function user_has_role($roles) {
    //checks if user has role/roles
    return !!count(array_intersect(is_array($roles)? $roles : array($roles), array_values($GLOBALS['user']->roles)));
};

if (user_has_role(array('moderator', 'administrator'))) {
  // $user is admin or moderator
} else if(user_has_role('tester')){
  // $user is tester
} else{
  // $user is not admin and not moderator
}

9

Оновлення для версії Drupal> = 7,36

Ви можете використовувати функцію user_has_role з API Drupal https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 .

Спробуйте цей приклад:

<?php
function MYMODULE_foo() {
  $role = user_role_load_by_name('Author');
  if (user_has_role($role->rid)) {
    // Code if user has 'Author' role...
  }
  else {
    // Code if user doesn't have 'Author' role...
  }

  $user = user_load(123);

  if(user_has_role($role->rid, $user)) {
    // Code if user has 'Author' role...
  }
  else {
    // Code if user doesn't have 'Author' role...
  }
}
?>

2

Ви можете встановити модуль devel і робити dpm ($ user). Це надрукує масив із усією інформацією про користувача, включаючи роль користувача.

З цього масиву ви можете знайти позицію масиву "ролі" та використовувати його у своєму модулі для пошуку ролі користувача.


У розділі Розробка-> Виконати PHP-код введіть: global $ user; dpm ($ користувач);
diamondsea

1

Щоб бути захищеним у майбутньому у випадку зміни імені ролі, краще перевірити наявність ролі (позбавлення), який можна знайти в таблиці ролей у базі даних.

Якщо ви хочете перевірити на роль у програмі rid 16, зробіть:

// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role, when 'editor' has role id 16
if (array_key_exists(16, $user->roles)) {
  // do fancy stuff
}

1
Насправді, коли ви мігруєте такі речі, як ролі, ім’я машини, ймовірно, збережеться, а ідентифікатор не буде
Mołot

У таблиці ролей немає назви машини, а лише ім'я людини та імені людини. Таблиця users_roles призначає uid для позбавлення.
Ганс Россель

1

Ось фактичний код із коментаря, який у прийнятій відповіді згадується як найкраща практика

<?php
  function mymodule_perm() {
    return array('access something special');
  }

  function dosomethingspecial() {
    // For current user
    if (user_access('access something special')) {
      // Doing something special!
    }

    // For a specific user
    if (user_access('access something special', $theuser)) {
      // Doing something special!
    }
  }
?>

0

Ви можете перевірити роль користувача, використовуючи print_r ($ user), і в результаті ви отримаєте щось подібне

Об'єкт stdClass
(
    [uid] => 0
    [ім'я хоста] => :: 1
    [ролі] => Масив
        (
            [1] => анонімний користувач // Моя поточна роль користувача є анонімною, у вашому випадку вона може бути різною
        )

0

щоб перевірити, чи користувач виконує певну роль:

function test_role(){
   global $user;
   if(isset($user->roles['my_role'])){
     return true;
   }
   else {
    return false;
 }
}

0
global $user;
$roleid = 123; //
if(user_has_role($roleid, $user)) {
//yes this user has this role
}

0

Наведені вище відповіді не спрацювали. Невідомий спосіб. Я знайшов, що цей пост і код повинен бути `

// Перевірте, чи має користувач $ роль адміністратора. if (in_array ('administrator', array_values ​​($ user-> role))) {// Зробіть щось. }?> `

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.