web-gelistirme-sc.com

Kullanıcının belirli bir sayfaya erişimi olup olmadığını kontrol edin

Bir kullanıcının belirli bir sayfaya erişim iznine sahip olup olmadığını nasıl belirleyebilirim?

23
farzan

Oturum açmış olan kullanıcının bir sayfaya erişimi olup olmadığını doğrulamak istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

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

$path, kontrol etmek istediğiniz sayfanın yoludur (örneğin, düğüm/1, yönetici/kullanıcı/kullanıcı).

Kod Drupal 6 ve daha yüksek sürümlerde çalışır ve menu_execute_active_handler () içinde kullanılan koddur.

Doğrudan erişim geri çağırma çağrısında bulunmamanın nedeni, bu işleve iletilmesi gereken bağımsız değişkenlerin olmasıdır.

_ menu_check_access () tarafından kullanılan kod aşağıdaki gibidir (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);
}

Mümkün olduğu kadar genel olması gereken kod, doğrudan bir kullanıcı nesnesini işlemez. Bu, şu anda oturum açmış olan kullanıcının kullanıcı nesnesini başka bir kullanıcı nesnesiyle değiştirmenin mümkün olmadığı anlamına gelir.
Kod, aşağıdakiler gibi menü tanımlarını işleyecek kadar genel olmalıdır:

$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),
);

Her iki tanımda da erişim bağımsız değişkenleri bir kullanıcı nesnesi içermez ve node_access () şu anda oturum açmış olan kullanıcı nesnesini kullanır kullanıcı. İkinci durumda, argümanlardan biri URL'den alınan düğüm nesnesidir; örneğin, URL example.com/node/1 ise, erişim geri aramasına iletilen ikinci bağımsız değişken, düğüm kimliği 1'e eşit olan düğümün düğüm nesnesidir.
Bu davaları da işleyen kod yazmak, Drupal'da zaten mevcut olan kodun kopyalanması anlamına gelir. Bu kodu çoğaltmış olsanız bile, o anda oturum açmış olan kullanıcıya erişimi kontrol eden erişim geri çağrıları sorunu devam eder.

Şu anda oturum açmış olan bir kullanıcının bir menüye erişip erişemeyeceğini kontrol etmek istiyorsanız, önce global değişken $user, cevabımın başında bildirdiğim kodu kullanın ve $user. Genel $user, şu anda oturum açmış olan kullanıcının oturumu kapatmasına neden olmadan Programlı olarak başka bir kullanıcının kimliğine bürünüyor . Fark, drupal_anonymous_user () öğesinden döndürülen değeri kullanmak yerine, user_load öğesinden döndürülen değeri kullanmanızdır. () .

25
kiamlaluno

drupal_valid_path () öğesini deneyin.

İşlev TRUE değerini döndürür. Bağımsız değişken var olduğu ve geçerli kullanıcının buna eriştiği yol. Bu nedenle, Drupal 7 üzerinde çalışıyorsanız ve şu anda oturum açmış olan kullanıcının erişimini kontrol etmeniz gerekiyorsa, gitmenin en kolay yolu:

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

Sayfadan sorumlu menü girişinde belirtilen access callback işlevini çağırın. Bu menü girişi genellikle Drupal hook_menu uygulamasının çağrılmasıyla oluşturulur ve veritabanında bir yerde saklanır. hook_menu tarafından döndürülen verilerin bir modül tarafından değiştirilebileceğine dikkat edin uygulamak hook_menu_alter .

Bazı modüllerin kullanıcıyı ayrı bir bağımsız değişken olarak (menü girişinin access arguments anahtarı ile belirtildiği gibi) geçirmeyebileceğini, bunun yerine global $user nesnesini kullanabileceğini unutmayın. Kullandığınız her modül için bunu kontrol etmeniz gerekecektir.

3
Oswald

user_access() işlevini kontrol edin. Her bir Drupal sürümü için belirtilen parametreler için bağlantıya bakın. Drupal 7-8 için dokümantasyon sayfasından:

Parametreler

$ string "Yönetim düğümleri" gibi izinlerin denetlenmesi.

$ account (isteğe bağlı) Kontrol edilecek hesap, verilmemişse o anda oturum açmış olan kullanıcıyı kullanın.

Dönüş değeri

Geçerli kullanıcı istenen izne sahipse Boole TRUE.

Drupal içindeki tüm izin kontrolleri bu işlevden geçmelidir. Bu şekilde, tutarlı davranışı garanti eder ve süper kullanıcının tüm eylemleri yapabilmesini sağlarız.

2
Laxman13

Kullanıcının belirli bir düğüme erişip erişemeyeceğini ve bir düğüm erişim modülü kullanıp kullanmadığını bilmeniz gerekiyorsa node_access () kullanabilirsiniz. (bir düğüm erişim modülü olmadan, yalnızca 'içeriğe erişim' iznine ihtiyaç duyarlar.)

Bir kullanıcının hook_menu () uygulaması tarafından tanımlanan rastgele bir yola erişip erişemeyeceğini bulmak istiyorsanız, menü girişini veritabanından almanız ve 'erişim geri arama' parametresini değerlendirmeniz gerekebilir.

2
gapple
    $node = node_load(123);

    $account = user_load(456);

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

         print "access";    
    }
2
Mahipal Purohit