Überprüfen Sie, ob ein Benutzer eine Rolle hat

46

Wie kann ich überprüfen, ob ein Benutzer eine bestimmte Rolle hat?

Ich fand dies aber es ist für Drupal 6.

giorgio79
quelle

Antworten:

87

Da Sie diesen Beitrag bereits gefunden haben , lesen Sie auch die Kommentare. Es wird klar erläutert, warum das Prüfen auf eine Berechtigung gegenüber dem Prüfen auf eine Rolle empfohlen wird. Wenn Sie Berechtigungen verwenden, können Sie diese mehreren Rollen zuweisen, wodurch Ihr System flexibler wird. Denken Sie auch daran, dass Rollen umbenannt werden können, wodurch Ihr Code beschädigt wird.

Das heißt, wenn Sie nach einer Rolle suchen möchten, können Sie dies tun:

// 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
quelle
1
Was ist, wenn ich mehr als eine Rolle prüfen möchte? zB Wenn "Herausgeber" oder "Verleger" als schickes Zeug tun. Wie codiere ich. Bitte empfehlen. Kann nicht wirklich herausfinden.
Adamtan
8
Bitte lesen Sie die Antwort: Es wird nicht empfohlen, nach einer Rolle zu suchen (oder nach mehr als einer). Suchen Sie stattdessen nach Berechtigungen. Der Rest Ihrer Frage (das Kombinieren von zwei Bedingungen in einer if-Anweisung) ist grundlegendes PHP, nichts mit Drupal zu tun. Lesen Sie die PHP-Dokumentation zu logischen Operatoren .
Marcvangend
11

Um zu überprüfen, ob der aktuelle Benutzer eine einzelne Rolle oder eine von mehreren Rollen hat, bieten sich folgende Möglichkeiten an:

//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
quelle
9

Update für Drupal-Version> = 7.36

Sie können die Funktion user_has_role über die Drupal-API https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 verwenden .

Versuchen Sie dieses Beispiel:

<?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
quelle
2

Sie könnten das Entwicklungsmodul installieren und dpm ($ user) ausführen. Dadurch wird ein Array mit allen Benutzerinformationen einschließlich der Benutzerrolle gedruckt.

In diesem Array können Sie die Array-Position von "Rollen" ermitteln und in Ihrem Modul verwenden, um die Benutzerrolle zu ermitteln.

Subramanian Hariharan
quelle
Geben Sie unter Entwicklung-> PHP-Code ausführen Folgendes ein: global $ user; dpm ($ user);
Diamondsea
1

Um für den Fall, dass sich der Rollenname ändert, zukunftssicher zu sein, überprüfen Sie am besten die Rollen-ID (rid), die in der Rollentabelle in der Datenbank zu finden ist.

Wenn Sie mit rid 16 nach einer Rolle suchen möchten, gehen Sie wie folgt vor:

// 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
quelle
1
Eigentlich, wenn Sie Dinge wie Rollen migrieren, wird der Computername wahrscheinlich beibehalten und die ID nicht
Mołot
In der Rollentabelle gibt es keinen Computernamen, sondern nur einen RID- und einen menschlichen Namen. Die Tabelle users_roles weist einem rid eine UID zu.
Hans Rossel
1

Hier ist der eigentliche Code aus dem Kommentar , der in der akzeptierten Antwort als Best Practice bezeichnet wird

<?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
quelle
0

Sie können die Rolle eines Benutzers mit print_r ($ user) überprüfen und in der Ausgabe erhalten Sie so etwas

stdClass-Objekt
(
    [UID] => 0
    [Hostname] => :: 1
    [Rollen] => Array
        (
            [1] => anonymer Benutzer // Meine aktuelle Benutzerrolle ist anonym, in Ihrem Fall kann dies anders sein
        )
Akash Bhawra
quelle
0

um zu überprüfen, ob ein Benutzer eine bestimmte Rolle hat:

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

Die obigen Antworten haben nicht funktioniert, ich bin mir nicht sicher, ob ich diesen Beitrag gefunden habe und der Code sollte "lauten"

// Überprüfen Sie, ob $ user die Administratorrolle hat. if (in_array ('administrator', array_values ​​($ user-> rollers)) {// Mach etwas. }?> `

pinueve
quelle