Controlla se un utente ha un ruolo


46

Come posso verificare se un utente ha un determinato ruolo?

Ho trovato questo, ma è per Drupal 6.

Risposte:


87

Dato che hai già trovato quel post , assicurati di leggere anche i commenti. Spiega chiaramente perché si consiglia di verificare un'autorizzazione rispetto alla verifica di un ruolo. Quando si utilizzano le autorizzazioni, è possibile assegnare tale autorizzazione a più ruoli, il che rende il sistema più flessibile. Inoltre, ricorda che i ruoli possono essere rinominati, il che spezzerebbe il tuo codice.

Detto questo, se vuoi controllare un ruolo, puoi farlo:

// 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
E se volessi controllare più di 1 ruolo. ad es. se "editore" o "editore" sono cose fantasiose. Come codificare. Si prega di avvisare. Non riesco a capire davvero.
Adamtan,

8
Si prega di leggere la risposta: non è consigliabile verificare un ruolo (o più di uno). Controlla invece le autorizzazioni. Il resto della tua domanda (che combina due condizioni in un'istruzione if) è PHP di base, niente di Drupal. Leggi la documentazione di PHP sugli operatori logici .
marcvangend,

11

Per verificare se l'utente corrente ha un singolo ruolo o uno qualsiasi di più ruoli, un ottimo modo è fare:

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

Aggiornamento per la versione di Drupal> = 7.36

Puoi utilizzare la funzione user_has_role dall'API Drupal https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 .

Prova questo esempio:

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

È possibile installare il modulo di sviluppo ed eseguire dpm ($ utente). Questo stamperà un array con tutte le informazioni dell'utente incluso il ruolo utente.

Da questo array è possibile trovare la posizione dell'array di "ruoli" e utilizzarlo nel modulo per trovare il ruolo utente.


Sotto Sviluppo-> Esegui codice PHP, inserisci: global $ user; DPM ($ user);
Diamondsea,

1

Per essere a prova di futuro nel caso in cui il nome del ruolo cambi, è meglio verificare l'id del ruolo (rid) che si trova nella tabella dei ruoli nel database.

Se vuoi controllare un ruolo con rid 16, fai:

// 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
In realtà, quando migra cose come i ruoli, il nome della macchina verrà probabilmente conservato e l'ID no
Mołot

Non esiste un nome macchina solo una rid e un nome umano nella tabella dei ruoli. La tabella users_roles assegna un uid a un rid.
Hans Rossel,

1

Ecco il codice effettivo del commento a cui si fa riferimento nella risposta accettata come best practice

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

Puoi controllare il ruolo di un utente tramite print_r ($ user) e nell'output otterrai qualcosa del genere

Oggetto stdClass
(
    [uid] => 0
    [hostname] => :: 1
    [ruoli] => Matrice
        (
            [1] => utente anonimo // Il ruolo utente corrente mio è anonimo nel tuo caso potrebbe essere diverso
        )

0

per verificare se un utente ha un determinato ruolo:

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

Le risposte sopra non hanno funzionato, non sono sicuro, ho trovato questo post e il codice dovrebbe essere `

// Verifica se $ user ha il ruolo di amministratore. if (in_array ('administrator', array_values ​​($ user-> ruoli))) {// Fai qualcosa. }?> `

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.