Comprobar si un usuario tiene un rol

46

¿Cómo puedo verificar si un usuario tiene un rol determinado?

Encontré esto pero es para Drupal 6.

giorgio79
fuente

Respuestas:

87

Como ya encontraste esa publicación , asegúrate de leer también los comentarios. Explica claramente por qué se recomienda buscar un permiso en lugar de buscar un rol. Cuando usa permisos, puede asignar ese permiso a múltiples roles, lo que hace que su sistema sea más flexible. Además, recuerde que los roles se pueden renombrar, lo que rompería su código.

Dicho esto, si desea verificar un rol, puede hacer esto:

// 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
fuente
1
¿Qué sucede si quiero verificar más de 1 rol? por ejemplo, si es "editor" o "editor" que hace cosas elegantes Cómo codificar Prfa aconsejen. No puedo entender realmente.
Adamtan
8
Lea la respuesta: no se recomienda verificar un rol (o más de uno). Verifique los permisos en su lugar. El resto de su pregunta (que combina dos condiciones en una declaración if) es PHP básico, nada relacionado con Drupal. Lea la documentación de PHP sobre operadores lógicos .
marcvangend
11

Para verificar si el usuario actual tiene un solo rol o alguno de los múltiples, una excelente manera es hacerlo:

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

Actualización para la versión de Drupal> = 7.36

Puede usar la función user_has_role de la API de Drupal https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 .

Prueba este ejemplo:

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

Puede instalar el módulo de desarrollo y hacer dpm ($ user). Esto imprimirá una matriz con toda la información del usuario, incluida la función del usuario.

Desde esta matriz puede encontrar la posición de la matriz de "roles" y usarla en su módulo para encontrar la función de usuario.

Subramanian Hariharan
fuente
En Desarrollo-> Ejecutar código PHP, ingrese: global $ user; dpm ($ usuario);
diamondsea
1

Para estar a prueba del futuro en caso de que cambie el nombre del rol, es mejor verificar el id del rol (rid) que se puede encontrar en la tabla de roles en la base de datos.

Si desea verificar un rol con rid 16, haga lo siguiente:

// 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
fuente
1
En realidad, cuando migras cosas como roles, el nombre de la máquina probablemente se mantendrá, y la identificación no se
mantendrá
No hay un nombre de máquina solo un nombre rid y humano en la tabla de roles. La tabla users_roles asigna un uid a un rid.
Hans Rossel
1

Aquí está el código real del comentario al que se hace referencia en la respuesta aceptada como la mejor práctica

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

Puede verificar el papel de un usuario mediante print_r ($ user) y en la salida obtendrá algo como esto

Objeto stdClass
(
    [uid] => 0
    [nombre de host] => :: 1
    [roles] => Array
        (
            [1] => usuario anónimo // El rol del usuario actual es anónimo en su caso, puede ser diferente
        )
akash bhawra
fuente
0

para verificar si un usuario tiene un rol determinado:

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

Las respuestas anteriores no funcionaron, no estoy seguro, encontré esta publicación y el código debería ser `

// Verifique si $ user tiene el rol de administrador. if (in_array ('administrador', array_values ​​($ user-> roles))) {// Haz algo. }?> `

pinueve
fuente