Sprawdź, czy użytkownik ma rolę


46

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

Znalazłem to, ale dotyczy Drupala 6.

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
}

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
}

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...
  }
}
?>

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.


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
}

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!
    }
  }
?>

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
        )

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;
 }
}

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

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ś. }?> `

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.