it-swarm-id.com

Periksa apakah pengguna memiliki akses ke halaman tertentu

Bagaimana saya bisa menentukan apakah pengguna memiliki izin untuk mengakses halaman tertentu?

23
farzan

Jika Anda ingin memverifikasi apakah pengguna yang saat ini masuk memiliki akses ke halaman, Anda dapat menggunakan kode berikut:

if ($router_item = menu_get_item($path)) {
  if ($router_item['access']) {
    // The user has access to the page in $path.
  }
}

$path adalah jalur halaman yang ingin Anda periksa (mis. simpul/1, admin/pengguna/pengguna).

Kode berfungsi dalam Drupal 6 dan versi yang lebih tinggi, dan ini adalah yang digunakan dari menu_execute_active_handler () .

Alasan saya tidak menyarankan untuk langsung memanggil akses callback adalah karena argumen yang perlu diteruskan ke fungsi itu.

Kode yang digunakan oleh _ menu_check_access () adalah yang berikut (Drupal 7):

$arguments = menu_unserialize($item['access_arguments'], $map);
// As call_user_func_array is quite slow and user_access is a very common
// callback, it is worth making a special case for it.
if ($callback == 'user_access') {
  $item['access'] = (count($arguments) == 1) ? user_access($arguments[0]) : user_access($arguments[0], $arguments[1]);
}
elseif (function_exists($callback)) {
  $item['access'] = call_user_func_array($callback, $arguments);
}

Kode, yang perlu sebanyak mungkin generik, tidak secara langsung menangani objek pengguna. Ini berarti bahwa tidak mungkin untuk mengganti objek pengguna untuk pengguna yang saat ini masuk dengan objek pengguna lain.
Kode harus cukup umum untuk menangani definisi menu seperti yang berikut:

$items['node/add/' . $type_url_str] = array(
  'title' => $type->name, 
  'title callback' => 'check_plain', 
  'page callback' => 'node_add', 
  'page arguments' => array($type->type), 
  'access callback' => 'node_access', 
  'access arguments' => array('create', $type->type), 
  'description' => $type->description, 
  'file' => 'node.pages.inc',
);

$items['node/%node'] = array(
  'title callback' => 'node_page_title', 
  'title arguments' => array(1),
  // The page callback also invokes drupal_set_title() in case
  // the menu router's title is overridden by a menu link. 
  'page callback' => 'node_page_view', 
  'page arguments' => array(1), 
  'access callback' => 'node_access', 
  'access arguments' => array('view', 1),
);

Dalam kedua definisi, argumen akses tidak menyertakan objek pengguna, dan node_access () dalam hal ini menggunakan objek pengguna untuk pengguna yang saat ini masuk. Dalam kasus kedua, salah satu argumennya adalah objek simpul yang diperoleh dari URL; misalnya, jika URL adalah example.com/node/1, maka argumen kedua yang diteruskan ke akses panggilan balik adalah objek simpul untuk simpul tersebut dengan simpul ID sama dengan 1.
Menulis kode yang menangani kasus-kasus ini juga berarti menduplikasi kode yang sudah ada di Drupal. Bahkan jika Anda menggandakan kode itu, masih akan ada masalah panggilan balik akses yang memeriksa akses terhadap pengguna yang saat ini masuk.

Jika Anda ingin memeriksa apakah pengguna yang bukan pengguna login saat ini dapat mengakses menu adalah untuk terlebih dahulu mengubah nilai variabel global $user, gunakan kode yang saya laporkan di awal jawaban saya, dan kemudian kembalikan nilai $user. Untuk cara mengubah nilai global $user, Anda dapat melihat Secara pemrograman meniru pengguna lain tanpa menyebabkan pengguna yang sedang masuk logout . Perbedaannya adalah, alih-alih menggunakan nilai yang dikembalikan dari drupal_anonymous_user () , Anda menggunakan nilai yang dikembalikan dari ser_load () .

25
kiamlaluno

Coba drupal_valid_path () .

Fungsi mengembalikan TRUE adalah lintasan yang dilewati karena argumen ada dan pengguna saat ini memiliki akses ke sana. Jadi, jika Anda bekerja pada Drupal 7 dan Anda perlu memeriksa akses pada pengguna yang saat ini masuk, itu cara termudah untuk pergi:

if (drupal_valid_path('my/path')) {
  // Your code here...
}
14
peterpoe

Panggil access callback yang ditentukan dalam entri menu yang bertanggung jawab untuk halaman tersebut. Entri menu itu biasanya dibuat oleh Drupal memanggil implementasi hook_menu dan disimpan di suatu tempat di database. Waspadalah bahwa data dikembalikan oleh hook_menu dapat diubah oleh modul yang mengimplementasikan hook_menu_alter .

Berhati-hatilah karena beberapa modul mungkin tidak lulus sebagai argumen yang terpisah (seperti yang ditentukan oleh access arguments kunci entri menu), tetapi mungkin menggunakan global $user objek sebagai gantinya. Anda harus memeriksa ini untuk setiap modul yang Anda gunakan.

3
Oswald

Lihat fungsi user_access() . Lihat tautan untuk parameter yang ditentukan untuk setiap versi Drupal. Dari halaman dokumentasi untuk Drupal 7-8:

Parameter

$ string Izin, seperti "kelola node", sedang diperiksa.

$ akun (opsional) Akun yang akan diperiksa, jika tidak digunakan, pengguna saat ini masuk.

Nilai pengembalian

Boolean TRUE jika pengguna saat ini memiliki izin yang diminta.

Semua pemeriksaan izin dalam Drupal harus melalui fungsi ini. Dengan cara ini, kami menjamin perilaku yang konsisten, dan memastikan bahwa pengguna super dapat melakukan semua tindakan.

2
Laxman13

Jika Anda perlu tahu apakah pengguna dapat mengakses node tertentu, dan menggunakan modul akses node, Anda dapat menggunakan node_access () . (tanpa modul akses simpul, mereka hanya memerlukan izin 'akses konten'.)

Jika Anda ingin mengetahui apakah pengguna dapat mengakses jalur arbitrer yang ditentukan oleh implementasi hook_menu (), Anda mungkin harus mengambil entri menu dari database dan mengevaluasi parameter 'akses panggilan balik'.

2
gapple
    $node = node_load(123);

    $account = user_load(456);

    if (node_access("update", $node, $account) === TRUE) 
   {

         print "access";    
    }
2
Mahipal Purohit