Periksa apakah pengguna memiliki peran

46

Bagaimana saya bisa memeriksa apakah pengguna memiliki peran tertentu?

Saya menemukan ini tetapi untuk Drupal 6.

giorgio79
sumber

Jawaban:

87

Karena Anda sudah menemukan posting itu , pastikan Anda juga membaca komentar. Ini dengan jelas menjelaskan mengapa memeriksa izin direkomendasikan daripada memeriksa peran. Saat Anda menggunakan izin, Anda dapat menetapkan izin itu ke beberapa peran, yang membuat sistem Anda lebih fleksibel. Juga, ingatlah bahwa peran dapat diubah namanya, yang akan merusak kode Anda.

Yang mengatakan, jika Anda ingin memeriksa peran, Anda dapat melakukan ini:

// 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
sumber
1
Bagaimana jika saya ingin memeriksa lebih dari 1 peran. misalnya Jika "editor" atau "penerbit" daripada melakukan hal-hal mewah. Cara membuat kode. Mohon saran. Tidak tahu benar.
Adamtan
8
Harap baca jawabannya: tidak disarankan untuk memeriksa peran (atau lebih dari satu). Periksa izinnya sebagai gantinya. Sisa pertanyaan Anda (menggabungkan dua kondisi dalam pernyataan-if) adalah PHP dasar, tidak ada yang terkait dengan Drupal. Baca dokumentasi PHP tentang operator logis .
marcvangend
11

Untuk memeriksa apakah pengguna saat ini memiliki peran tunggal atau peran ganda apa pun, cara yang bagus adalah dengan melakukan:

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

Pembaruan untuk versi Drupal> = 7.36

Anda dapat menggunakan fungsi user_has_role dari Drupal API https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 .

Coba contoh ini:

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

Anda dapat menginstal devel module dan melakukan dpm ($ user). Ini akan mencetak array dengan semua informasi pengguna termasuk peran pengguna.

Dari larik ini, Anda dapat menemukan posisi larik "peran" dan menggunakannya dalam modul Anda untuk menemukan peran pengguna.

Subhaman Hariharan
sumber
Di bawah Pengembangan-> Jalankan kode PHP, masukkan: global $ user; dpm ($ user);
diamondsea
1

Untuk menjadi futureproof jika nama peran berubah, yang terbaik adalah memeriksa id peran (menyingkirkan) yang dapat ditemukan di tabel peran dalam database.

Jika Anda ingin memeriksa peran dengan rid 16, lakukan:

// 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
sumber
1
Sebenarnya, ketika Anda melakukan migrasi hal-hal seperti peran, nama mesin mungkin akan disimpan, dan ID tidak akan
Mołot
Tidak ada nama mesin hanya sebuah rid dan nama manusia di tabel peran. Tabel users_roles menetapkan uid untuk dihapus.
Hans Rossel
1

Berikut kode aktual dari komentar yang disebut dalam jawaban yang diterima sebagai praktik terbaik

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

Anda dapat memeriksa peran pengguna dengan print_r ($ user) dan hasilnya Anda akan mendapatkan sesuatu seperti ini

stdClass Object
(
    [uid] => 0
    [hostname] => :: 1
    [peran] => Array
        (
            [1] => pengguna anonim // Tambang peran pengguna saat ini adalah anonim dalam kasus Anda, ini mungkin berbeda
        )
akash bhawra
sumber
0

untuk memeriksa apakah pengguna memiliki peran tertentu:

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

Jawaban di atas tidak berfungsi, tidak yakin cara, saya menemukan posting ini dan kode harus `

// Periksa untuk melihat apakah $ user memiliki peran administrator. if (in_array ('administrator', array_values ​​($ user-> peran)))) {// Lakukan sesuatu. }?> `

tajam
sumber