Verifique se um usuário tem uma função

46

Como posso verificar se um usuário tem uma determinada função?

Achei isso, mas é para o Drupal 6.

giorgio79
fonte

Respostas:

87

Como você já encontrou essa postagem , leia também os comentários. Explica claramente por que é recomendável verificar uma permissão em vez de verificar uma função. Ao usar permissões, você pode atribuir essa permissão a várias funções, o que torna seu sistema mais flexível. Além disso, lembre-se de que as funções podem ser renomeadas, o que quebraria seu código.

Dito isto, se você deseja verificar uma função, pode fazer o seguinte:

// 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
fonte
1
E se eu quiser verificar mais de uma função. Por exemplo, se "editor" ou "editor" do que coisas sofisticadas. Como codificar. Por favor, avise. Não consigo descobrir realmente.
Adamtan 15/05
8
Leia a resposta: não é recomendável verificar uma função (ou mais de uma). Verifique as permissões. O restante da sua pergunta (combinando duas condições em uma instrução if) é PHP básico, nada relacionado ao Drupal. Leia a documentação do PHP sobre operadores lógicos .
Marcvangend 15/05
11

Para verificar se o usuário atual tem uma única função ou várias funções, uma ótima maneira é:

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

Atualização para a versão Drupal> = 7.36

Você pode usar a função user_has_role na API Drupal https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 .

Tente este exemplo:

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

Você pode instalar o módulo devel e fazer o dpm ($ user). Isso imprimirá uma matriz com todas as informações do usuário, incluindo a função do usuário.

Nessa matriz, você pode encontrar a posição da matriz de "funções" e usá-la em seu módulo para encontrar a função do usuário.

Hariharan Subramanian
fonte
Em Desenvolvimento-> Executar código PHP, digite: global $ user; dpm ($ usuário);
Diamondsea
1

Para ser à prova de futuro, caso o nome da função mude, é melhor verificar o ID da função (rid) que pode ser encontrado na tabela de funções no banco de dados.

Se você deseja procurar uma função com o número 16, faça:

// 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
fonte
1
Na verdade, quando você migra coisas como papéis, nome da máquina provavelmente será mantido, e ID não vai
MOLOT
Não existe um nome de máquina apenas um nome ridículo e um humano na tabela de funções. A tabela users_roles atribui um uid a um rid.
Hans Rossel
1

Aqui está o código real do comentário mencionado na resposta aceita como a melhor prática

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

Você pode verificar o papel de um usuário imprimindo ($ user) e, na saída, obterá algo como isto

Objeto stdClass
(
    [uid] => 0
    [nome do host] => :: 1
    [funções] => Matriz
        (
            [1] => usuário anônimo // A função atual do usuário é anônima. No seu caso, pode ser diferente
        )
akash bhawra
fonte
0

para verificar se um usuário tem uma determinada função:

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

As respostas acima não funcionaram, não tenho certeza, encontrei este post e o código deve ser `

// Verifique se $ user tem a função de administrador. if (in_array ('administrador', array_values ​​($ usuário-> funções))) {// Faça alguma coisa. }?> `

pinueve
fonte