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


23

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


Hangi Drupal sürümünü kullandığınızı belirtmediniz. Hedefiniz hakkında daha ayrıntılı bilgi de faydalı olabilir; En yaygın durumlarda, Drupal menü erişimini otomatik olarak idare eder.
Dylan Tack,

Yanıtlar:


25

Şu anda oturum açan 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 (örn. düğüm / 1, admin / kullanıcı / kullanıcı).

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

Doğrudan geri arama erişimini çağırmamı önermemin nedeni, bu işleve iletilmesi gereken argümanlardı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ğunca jenerik olması gereken kod, bir kullanıcı nesnesini doğrudan işlemez. Bu, şu anda oturum açan kullanıcının kullanıcı nesnesini başka bir kullanıcı nesnesiyle değiştirmek mümkün olmadığı anlamına gelir.
Kod, aşağıdakiler gibi menü tanımlarını işlemek için yeterince 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 değişkenleri bir kullanıcı nesnesi içermez ve bu durumda node_access () , oturum açmış olan kullanıcı için kullanıcı nesnesini kullanır. İkinci durumda, argümanlardan biri, URL'den elde edilen düğüm nesnesidir; URL example.com/node/1 ise örneğin, daha sonra erişim callback'inde geçirilen ikinci argüman düğüm kimliği ile düğüm için düğüm nesnesi 1. eşit olduğunu
kolları bu vakalar çok yinelenen kod anlamına geleceğini Yazma kodu Drupal'da zaten var. Bu kodu kopyalasanız bile, halen oturum açmış olan kullanıcıya karşı erişimi denetleyen erişim geri aramalarının sorunu yine de olacaktır.

Şu anda oturum açmış kullanıcı olmayan bir kullanıcının bir menüye erişip erişemediğini kontrol etmek istiyorsanız, önce genel değişkenin değerini değiştirmek, $usercevabımın başında bildirdiğim kodu kullanmak ve sonra değerini değiştirmek için $user. Globalin değerini nasıl değiştireceğinizi $usergörmek için, oturum açmış kullanıcının oturumu kapatmasına neden olmadan Programlı olarak başka bir kullanıcının kimliğine büründüğünü görebilirsiniz . Aradaki 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 .


Bu kodun hangi kancada yazılacağını öğrenebilir miyim?
Gladyatör

14

Drupal_valid_path () işlevini deneyin .

Döndürür işlevi TRUE, argüman olduğu için iletilen yol ve mevcut kullanıcının buna erişimi var. Bu nedenle, Drupal 7 üzerinde çalışıyorsanız ve 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...
}

1
D7'de, drupal_valid_pathiş mükemmel bir şekilde yapılıyor ve bu kesin ihtiyacı karşılamak için yapıldı. Menu_get_item kullanır ve erişimi de kontrol eder.
Weboide

Bu doğru, ancak yalnızca oturum açmış olan kullanıcı için çalışıyor. Başka bir kullanıcının yola erişip erişemediğini bilmek istiyorsanız, drupal_valid_pathsize yardımcı olmaz.
Andrew Schulman

@AndrewSchulman Bunun için bir API olduğunu sanmıyorum, ancak kullanıcıları geçici olarak değiştirebilirsiniz.
peterpoe

Drupal 8'de, bu taşındı \Drupal::service('path.validator')->isValid($path);- bkz API belgelerine
Gogowitsch

3

Sayfadan access callbacksorumlu olan menü girişinde belirtilenleri arayın . Bu menü girişi, genellikle Drupal tarafından uygulamayı çağırarak oluşturulur hook_menuve veritabanında bir yerde saklanır. Döndürülen verilerin hook_menubir modül uygulaması tarafından değiştirilebileceğini unutmayın hook_menu_alter.

Bazı modüllerin kullanıcıyı ayrı bir argüman olarak iletmeyebileceğine dikkat edin ( access argumentsmenü girişi tuşuyla belirtildiği gibi ), bunun yerine bunun yerine genel $usernesneyi kullanabilir . Bunu, kullandığınız her modül için kontrol etmeniz gerekecektir.


Bu yöntem, oyunculuk yapan kullanıcılardan başka bir kullanıcının sayfaya erişmesine izin verilip verilmediğini bulmak için kullanılabilir.
Oswald

1
Erişim geri aramasını çağırmak, başka bir işlevi çağırmak kadar kolay değildir; erişim geri aramasının belirli argümanlara ihtiyacı vardır; şu anda oturum açan kullanıcının bir menüye erişip erişmediğini kontrol eden işlev olan _menu_check_access () işlevine bakın .
kiamlaluno

2

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

Parametreler

$ string "admin node" gibi izinler kontrol ediliyor.

$ account (isteğe bağlı) Şu anda oturum açmış olan kullanıcının kullanımına izin verilmezse kontrol edilecek hesap.

Geri dönüş değeri

Geçerli kullanıcı istenen izne sahipse, DOĞRU DOĞRU.

Drupal'daki tüm izin kontrolleri bu fonksiyondan geçmelidir. Bu şekilde, tutarlı davranışı garanti ediyoruz ve süper kullanıcının tüm işlemleri yapabilmesini sağlıyoruz.


user_access (), kullanıcının belirli bir "izin türüne" sahip olup olmadığını kontrol etmek içindir. İhtiyaç duyulan şey, kullanıcının belirli bir "yola" erişebilmesidir; örneğin, kullanıcı 'düğüm / 12' ye erişebiliyorsa?
farzan

Peki bir kullanıcının izni olup olmadığını nasıl belirlersiniz? İzinler sayfasında, belirli rollere izin vermek için işaretlemiş veya
onaylamamış

user_access()her zaman bir menü tarafından kullanılan erişim geri araması değildir; Öyle olsa bile, iletmeniz gereken erişim argümanlarını bilmelisiniz user_access().
kiamlaluno

Her zaman olmadığını biliyorum user_access(), sadece OP'nin kullanıcının erişip erişemeyeceğini kontrol etmek için bir izne sahip olduğunu düşündüm. Çok açıklayıcı bir soru değil
Laxman13

User_access belirli bir yola erişimi kontrol edemese de, user_access'i mümkün olan her durumda erişimi kontrol etmenin en iyi yolu olduğunu düşünüyorum. İyi cevap @ Laxman13 +1.
AyeshK

2

Bir kullanıcının belirli bir düğüme erişip erişemediğini bilmeniz gerekiyorsa ve bir düğüm erişim modülü kullanıyorsanız, node_access () öğesini kullanabilirsiniz . (bir düğüm erişim modülü olmadan sadece 'erişim içeriği' iznine ihtiyaçları vardır.)

Bir kullanıcının bir hook_menu () uygulaması tarafından tanımlanan rasgele bir yola erişip erişemediğini anlamak istiyorsanız, menüden veri tabanından menü girişini almanız ve 'erişim geri çağırma' parametresini değerlendirmeniz gerekebilir.


2
    $node = node_load(123);

    $account = user_load(456);

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

         print "access";    
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.