Sprawdź, czy użytkownik ma rolę

46

Jak mogę sprawdzić, czy użytkownik ma określoną rolę?

Znalazłem to, ale dotyczy Drupala 6.

giorgio79
źródło

Odpowiedzi:

87

Ponieważ już znalazłeś ten post , upewnij się, że przeczytałeś również komentarze. Wyjaśnia jasno, dlaczego zaleca się sprawdzanie uprawnień zamiast sprawdzania roli. Korzystając z uprawnień, możesz przypisać to uprawnienie do wielu ról, co czyni system bardziej elastycznym. Pamiętaj też, że można zmienić nazwy ról, co spowodowałoby uszkodzenie twojego kodu.

To powiedziawszy, jeśli chcesz sprawdzić rolę, możesz to zrobić:

// 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
}
marcvangend
źródło
1
Co jeśli chcę sprawdzić więcej niż 1 rolę. np. Jeśli „redaktor” lub „wydawca”, to wymyślne rzeczy. Jak kodować. Proszę o poradę. Naprawdę nie mogę zrozumieć.
Adamtan
8
Przeczytaj odpowiedź: nie zaleca się sprawdzania roli (lub więcej niż jednej). Zamiast tego sprawdź uprawnienia. Reszta twojego pytania (łączenie dwóch warunków w instrukcji if) jest podstawową wersją PHP, bez powiązania z Drupalem. Przeczytaj dokumentację PHP dotyczącą operatorów logicznych .
marcvangend
11

Aby sprawdzić, czy bieżący użytkownik ma jedną rolę, czy jedną z wielu ról, doskonałym sposobem jest:

//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
}
Sadanand Kenganal
źródło
9

Aktualizacja dla wersji Drupal> = 7,36

Możesz użyć funkcji user_has_role z Drupal API https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 .

Spróbuj tego przykładu:

<?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...
  }
}
?>
Marcin
źródło
2

Możesz zainstalować moduł devel i zrobić dpm ($ user). Spowoduje to wydrukowanie tablicy ze wszystkimi informacjami o użytkowniku, w tym o roli użytkownika.

Z tej tablicy można znaleźć pozycję tablicy „ról” i użyć jej w module, aby znaleźć rolę użytkownika.

Subramanian Hariharan
źródło
W obszarze Rozwój-> Wykonaj kod PHP wpisz: global $ user; dpm (użytkownik $);
diamondsea
1

Aby być przyszłościowym na wypadek zmiany nazwy roli, najlepiej sprawdzić identyfikator roli (rid), który można znaleźć w tabeli ról w bazie danych.

Jeśli chcesz sprawdzić rolę w rid 16, wykonaj:

// 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
}
Hans Rossel
źródło
1
W rzeczywistości, kiedy migrujesz rzeczy takie jak role, nazwa komputera prawdopodobnie zostanie zachowana, a identyfikator nie
Mołot
W tabeli ról nie ma nazwy maszyny, tylko imię i imię ludzkie. Tabela users_roles przypisuje identyfikator użytkownika do rid.
Hans Rossel,
1

Oto rzeczywisty kod z komentarza , który w przyjętej odpowiedzi jest określany jako najlepsza praktyka

<?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!
    }
  }
?>
Eric Johnson
źródło
0

Możesz sprawdzić rolę użytkownika przez print_r ($ user), a w wyniku otrzymasz coś takiego

Obiekt stdClass
(
    [uid] => 0
    [nazwa hosta] => :: 1
    [role] => Array
        (
            [1] => anonimowy użytkownik // Moja obecna rola użytkownika jest anonimowa w twoim przypadku może być inna
        )
akash bhawra
źródło
0

aby sprawdzić, czy użytkownik ma określoną rolę:

function test_role(){
   global $user;
   if(isset($user->roles['my_role'])){
     return true;
   }
   else {
    return false;
 }
}
houmem
źródło
0
global $user;
$roleid = 123; //
if(user_has_role($roleid, $user)) {
//yes this user has this role
}
adal
źródło
0

Powyższe odpowiedzi nie działały, nie jestem pewien, znalazłem ten post i kod powinien brzmieć `

// Sprawdź, czy $ user ma rolę administratora. if (in_array ('administrator', array_values ​​($ user-> role))) {// Zrób coś. }?> `

pinueve
źródło