जांचें कि क्या उपयोगकर्ता के पास किसी निश्चित पृष्ठ तक पहुंच है


23

मैं यह कैसे निर्धारित कर सकता हूं कि उपयोगकर्ता के पास किसी निश्चित पृष्ठ तक पहुंचने की अनुमति है या नहीं?


आपने ड्रुपल के किस संस्करण का उपयोग किया है, यह आपने निर्दिष्ट नहीं किया है। आपके लक्ष्य के बारे में अधिक जानकारी भी उपयोगी होगी; सबसे आम मामलों में Drupal मेनू एक्सेस को स्वचालित रूप से हैंडल करेगा।
डायलन टाॅक

जवाबों:


25

यदि आप सत्यापित करना चाहते हैं कि वर्तमान में लॉग-इन उपयोगकर्ता के पास किसी पृष्ठ तक पहुंच है, तो आप निम्न कोड का उपयोग कर सकते हैं:

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

$path उस पृष्ठ का पथ है जिसे आप जांचना चाहते हैं (जैसे नोड / 1, व्यवस्थापक / उपयोगकर्ता / उपयोगकर्ता)।

कोड Drupal 6 और उच्चतर संस्करणों में काम करता है, और यह menu_execute_active_handler () से उपयोग किया जाता है ।

कारण मैं सीधे कॉलबैक पर कॉल करने का सुझाव नहीं दे रहा हूं, क्योंकि उन तर्कों को उस फ़ंक्शन को पारित करने की आवश्यकता है।

_Menu_check_access () द्वारा उपयोग किया जाने वाला कोड निम्नलिखित है (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);
}

कोड, जो जितना संभव हो उतना सामान्य होने की आवश्यकता है, सीधे उपयोगकर्ता ऑब्जेक्ट को संभाल नहीं करता है। इसका अर्थ है कि वर्तमान में लॉग-इन किए गए उपयोगकर्ता के लिए उपयोगकर्ता ऑब्जेक्ट को किसी अन्य उपयोगकर्ता ऑब्जेक्ट के साथ बदलना संभव नहीं है।
निम्नलिखित कोड जैसे मेनू परिभाषाओं को संभालने के लिए कोड काफी सामान्य होना चाहिए:

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

दोनों परिभाषाओं में, एक्सेस तर्कों में एक उपयोगकर्ता ऑब्जेक्ट शामिल नहीं है, और इस मामले में नोड_access () वर्तमान में लॉग इन उपयोगकर्ता के लिए उपयोगकर्ता ऑब्जेक्ट का उपयोग करता है। दूसरे मामले में तर्क में से एक नोड ऑब्जेक्ट है जो URL से प्राप्त होता है; उदाहरण के लिए, यदि URL example.com/node/1 है, तो एक्सेस कॉलबैक के लिए दिया गया दूसरा तर्क नोड नोड के साथ नोड ऑब्जेक्ट के बराबर है। 1.
कोड लिखना जो इन मामलों को संभालता है, का अर्थ डुप्लिकेट कोड से भी होगा। पहले से ही Drupal में मौजूद है। यहां तक ​​कि अगर आप उस कोड को डुप्लिकेट करते हैं, तब भी एक्सेस कॉलबैक की समस्या होगी जो वर्तमान में लॉग-इन उपयोगकर्ता के खिलाफ एक्सेस की जांच कर रहे हैं।

यदि आप यह जांचना चाहते हैं कि क्या कोई उपयोगकर्ता जो वर्तमान में लॉग-इन उपयोगकर्ता नहीं है, तो वह मेनू का उपयोग कर सकता है, सबसे पहले वैश्विक चर के मान को बदल $userसकता है, मेरे उत्तर की शुरुआत में मेरे द्वारा बताए गए कोड का उपयोग करें, और फिर मूल्य को पुनर्स्थापित करें $user। वैश्विक के मूल्य को कैसे बदला जाए $user, इसके लिए आप प्रोग्रामेटिक रूप से किसी अन्य उपयोगकर्ता को बिना लॉग-इन किए उपयोगकर्ता को वर्तमान में लॉग आउट करते हुए देख सकते हैं । अंतर यह है कि, drupal_anonymous_user () से लौटाए गए मान का उपयोग करने के बजाय , आप user_load () से दिए गए मान का उपयोग करते हैं ।


क्या मुझे पता है कि यह कोड किस हुक में लिखा जाना चाहिए।
ग्लेडिएटर

14

Drupal_valid_path () का प्रयास करें ।

फ़ंक्शन रिटर्न TRUEवह मार्ग है जिसे तर्क मौजूद है और वर्तमान उपयोगकर्ता की पहुंच है। इसलिए, यदि आप Drupal 7 पर काम कर रहे हैं और आपको वर्तमान में लॉग इन उपयोगकर्ता की पहुँच की जाँच करने की आवश्यकता है, तो यह जाने का सबसे आसान तरीका है:

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

1
डी 7 में, drupal_valid_pathपूरी तरह से काम करता है और इस सटीक ज़रूरत को पूरा करने के लिए बनाया गया है। यह menu_get_item का उपयोग करता है और साथ ही एक्सेस की जांच करता है।
वीबो

यह सच है, लेकिन यह केवल वर्तमान में लॉग-इन उपयोगकर्ता के लिए काम करता है। यदि आप यह जानना चाहते हैं कि क्या कोई अन्य उपयोगकर्ता पथ तक पहुँच सकता है, तो drupal_valid_pathआपकी मदद नहीं करेगा।
एंड्रयू शुलमैन

@AndrewSchulman मुझे नहीं लगता कि इसके लिए कोई API है, लेकिन आप उपयोगकर्ताओं को अस्थायी रूप से स्विच कर सकते हैं।
पेट्रोपो

ड्रुपल 8 में, यह स्थानांतरित हो गया है \Drupal::service('path.validator')->isValid($path);- एपीआई प्रलेखन
गोगोविट्स्क

3

उसे कॉल करें access callbackजो मेनू प्रविष्टि में निर्दिष्ट है जो पृष्ठ के लिए जिम्मेदार है। उस मेनू प्रविष्टि को आमतौर पर Drupal द्वारा कार्यान्वित hook_menuकिया जाता है और डेटाबेस में कहीं संग्रहीत किया जाता है। खबरदार कि hook_menuमॉड्यूल द्वारा लागू किए गए डेटा को बदल दिया जाए hook_menu_alter

सावधान रहें कि कुछ मॉड्यूल उपयोगकर्ता को एक अलग तर्क ( access argumentsमेनू प्रविष्टि की कुंजी द्वारा निर्दिष्ट) के रूप में पारित नहीं कर सकते हैं , लेकिन इसके बजाय वैश्विक $userऑब्जेक्ट का उपयोग कर सकते हैं । आपको इसका उपयोग प्रत्येक मॉड्यूल के लिए करना होगा।


इस पद्धति का उपयोग यह पता लगाने के लिए किया जा सकता है कि क्या अभिनय उपयोगकर्ता की तुलना में कुछ अन्य उपयोगकर्ता को पृष्ठ तक पहुंचने की अनुमति है।
ओसवाल्ड 12

1
एक्सेस कॉलबैक को कॉल करना किसी अन्य फ़ंक्शन को कॉल करना उतना आसान नहीं है, क्योंकि एक्सेस कॉलबैक के लिए विशिष्ट तर्कों की आवश्यकता होती है; देखें _menu_check_access () , जो कि वह फ़ंक्शन है जो जाँचता है कि वर्तमान में लॉग इन उपयोगकर्ता के पास मेनू है।
kiamlaluno

2

की जाँच करें user_access()कार्य करते हैं। Drupal के प्रत्येक संस्करण के लिए निर्दिष्ट मापदंडों के लिए लिंक देखें। Drupal के लिए प्रलेखन पृष्ठ से 7-8:

पैरामीटर

$ स्ट्रिंग अनुमति, जैसे कि "प्रशासन नोड्स", के लिए जाँच की जा रही है।

$ खाता (वैकल्पिक) खाते की जांच करने के लिए, यदि उपयोग नहीं किया गया है वर्तमान में लॉग इन उपयोगकर्ता।

प्रतिलाभ की मात्रा

बूलियन TRUE यदि वर्तमान उपयोगकर्ता के पास अनुरोधित अनुमति है।

Drupal में सभी अनुमति जांच इस फ़ंक्शन के माध्यम से जानी चाहिए। इस तरह, हम लगातार व्यवहार की गारंटी देते हैं, और यह सुनिश्चित करते हैं कि सुपरयुसर सभी कार्यों को कर सकता है।


user_access () यह जाँचने के लिए है कि क्या उपयोगकर्ता के पास अनुमतियों का एक निश्चित "प्रकार" है। अगर उपयोगकर्ता एक निश्चित "पथ" तक पहुंच सकता है, तो क्या आवश्यकता है; उदाहरण के लिए, यदि उपयोगकर्ता 'नोड / 12' तक पहुंच सकता है?
दूरबीन

जब आप एक उपयोगकर्ता की अनुमति है या नहीं तो आप कैसे निर्धारित कर रहे हैं? मुझे लगता है कि अनुमति पृष्ठ पर एक विकल्प है जिसे आपने या तो कुछ भूमिकाओं की जाँच की है या नहीं की अनुमति देने के लिए
Laxman13

user_access()हमेशा मेनू द्वारा उपयोग की जाने वाली कॉलबैक नहीं होती है; यहां तक ​​कि यह होगा, आपको उन पहुंच तर्कों को जानना चाहिए जिन्हें आपको पास करने की आवश्यकता है user_access()
kiamlaluno

मुझे पता है कि यह हमेशा नहीं होता है user_access(), केवल यह पता लगाने के लिए कि क्या उपयोगकर्ता की पहुंच होनी चाहिए, यह देखने के लिए ओपी को ध्यान में रखने की अनुमति थी। बहुत वर्णनात्मक प्रश्न नहीं
लक्ष्मण १३

भले ही user_access किसी विशिष्ट पथ तक पहुँच की जाँच नहीं कर सकता है, फिर भी मुझे लगता है कि जब भी संभव हो user_access का उपयोग करना सबसे अच्छा तरीका है। अच्छा उत्तर @ लक्ष्मण 13 +1।
आयुष

2

यदि आपको यह जानने की आवश्यकता है कि क्या कोई उपयोगकर्ता किसी विशेष नोड तक पहुंच सकता है, और नोड एक्सेस मॉड्यूल का उपयोग कर रहा है, तो आप नोड_एसीट () का उपयोग कर सकते हैं । (नोड एक्सेस मॉड्यूल के बिना उन्हें सिर्फ 'एक्सेस कंटेंट' अनुमति की आवश्यकता होती है।)

यदि आप यह पता लगाना चाहते हैं कि क्या उपयोगकर्ता एक मनमाना पथ का उपयोग कर सकता है जो एक हुक_मेनू () कार्यान्वयन द्वारा परिभाषित किया गया है, तो आपको डेटाबेस से मेनू प्रविष्टि को पुनः प्राप्त करना होगा और इसके 'एक्सेस कॉलबैक' पैरामीटर का मूल्यांकन करना होगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.