Bir kullanıcının belirli bir sayfaya erişim izni olup olmadığını nasıl belirleyebilirim?
Bir kullanıcının belirli bir sayfaya erişim izni olup olmadığını nasıl belirleyebilirim?
Yanıtlar:
Ş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, $user
cevabı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 $user
gö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 .
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...
}
drupal_valid_path
iş 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.
drupal_valid_path
size yardımcı olmaz.
\Drupal::service('path.validator')->isValid($path);
- bkz API belgelerine
Sayfadan access callback
sorumlu olan menü girişinde belirtilenleri arayın . Bu menü girişi, genellikle Drupal tarafından uygulamayı çağırarak oluşturulur hook_menu
ve veritabanında bir yerde saklanır. Döndürülen verilerin hook_menu
bir 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 arguments
menü girişi tuşuyla belirtildiği gibi ), bunun yerine bunun yerine genel $user
nesneyi kullanabilir . Bunu, kullandığınız her modül için kontrol etmeniz gerekecektir.
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()
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()
.
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
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.
$node = node_load(123);
$account = user_load(456);
if (node_access("update", $node, $account) === TRUE)
{
print "access";
}