मैं यह कैसे निर्धारित कर सकता हूं कि उपयोगकर्ता के पास किसी निश्चित पृष्ठ तक पहुंचने की अनुमति है या नहीं?
मैं यह कैसे निर्धारित कर सकता हूं कि उपयोगकर्ता के पास किसी निश्चित पृष्ठ तक पहुंचने की अनुमति है या नहीं?
जवाबों:
यदि आप सत्यापित करना चाहते हैं कि वर्तमान में लॉग-इन उपयोगकर्ता के पास किसी पृष्ठ तक पहुंच है, तो आप निम्न कोड का उपयोग कर सकते हैं:
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 () से दिए गए मान का उपयोग करते हैं ।
Drupal_valid_path () का प्रयास करें ।
फ़ंक्शन रिटर्न TRUE
वह मार्ग है जिसे तर्क मौजूद है और वर्तमान उपयोगकर्ता की पहुंच है। इसलिए, यदि आप Drupal 7 पर काम कर रहे हैं और आपको वर्तमान में लॉग इन उपयोगकर्ता की पहुँच की जाँच करने की आवश्यकता है, तो यह जाने का सबसे आसान तरीका है:
if (drupal_valid_path('my/path')) {
// Your code here...
}
drupal_valid_path
पूरी तरह से काम करता है और इस सटीक ज़रूरत को पूरा करने के लिए बनाया गया है। यह menu_get_item का उपयोग करता है और साथ ही एक्सेस की जांच करता है।
drupal_valid_path
आपकी मदद नहीं करेगा।
\Drupal::service('path.validator')->isValid($path);
- एपीआई प्रलेखन
उसे कॉल करें access callback
जो मेनू प्रविष्टि में निर्दिष्ट है जो पृष्ठ के लिए जिम्मेदार है। उस मेनू प्रविष्टि को आमतौर पर Drupal द्वारा कार्यान्वित hook_menu
किया जाता है और डेटाबेस में कहीं संग्रहीत किया जाता है। खबरदार कि hook_menu
मॉड्यूल द्वारा लागू किए गए डेटा को बदल दिया जाए hook_menu_alter
।
सावधान रहें कि कुछ मॉड्यूल उपयोगकर्ता को एक अलग तर्क ( access arguments
मेनू प्रविष्टि की कुंजी द्वारा निर्दिष्ट) के रूप में पारित नहीं कर सकते हैं , लेकिन इसके बजाय वैश्विक $user
ऑब्जेक्ट का उपयोग कर सकते हैं । आपको इसका उपयोग प्रत्येक मॉड्यूल के लिए करना होगा।
की जाँच करें user_access()
कार्य करते हैं। Drupal के प्रत्येक संस्करण के लिए निर्दिष्ट मापदंडों के लिए लिंक देखें। Drupal के लिए प्रलेखन पृष्ठ से 7-8:
पैरामीटर
$ स्ट्रिंग अनुमति, जैसे कि "प्रशासन नोड्स", के लिए जाँच की जा रही है।
$ खाता (वैकल्पिक) खाते की जांच करने के लिए, यदि उपयोग नहीं किया गया है वर्तमान में लॉग इन उपयोगकर्ता।
प्रतिलाभ की मात्रा
बूलियन TRUE यदि वर्तमान उपयोगकर्ता के पास अनुरोधित अनुमति है।
Drupal में सभी अनुमति जांच इस फ़ंक्शन के माध्यम से जानी चाहिए। इस तरह, हम लगातार व्यवहार की गारंटी देते हैं, और यह सुनिश्चित करते हैं कि सुपरयुसर सभी कार्यों को कर सकता है।
user_access()
हमेशा मेनू द्वारा उपयोग की जाने वाली कॉलबैक नहीं होती है; यहां तक कि यह होगा, आपको उन पहुंच तर्कों को जानना चाहिए जिन्हें आपको पास करने की आवश्यकता है user_access()
।
user_access()
, केवल यह पता लगाने के लिए कि क्या उपयोगकर्ता की पहुंच होनी चाहिए, यह देखने के लिए ओपी को ध्यान में रखने की अनुमति थी। बहुत वर्णनात्मक प्रश्न नहीं
यदि आपको यह जानने की आवश्यकता है कि क्या कोई उपयोगकर्ता किसी विशेष नोड तक पहुंच सकता है, और नोड एक्सेस मॉड्यूल का उपयोग कर रहा है, तो आप नोड_एसीट () का उपयोग कर सकते हैं । (नोड एक्सेस मॉड्यूल के बिना उन्हें सिर्फ 'एक्सेस कंटेंट' अनुमति की आवश्यकता होती है।)
यदि आप यह पता लगाना चाहते हैं कि क्या उपयोगकर्ता एक मनमाना पथ का उपयोग कर सकता है जो एक हुक_मेनू () कार्यान्वयन द्वारा परिभाषित किया गया है, तो आपको डेटाबेस से मेनू प्रविष्टि को पुनः प्राप्त करना होगा और इसके 'एक्सेस कॉलबैक' पैरामीटर का मूल्यांकन करना होगा।
$node = node_load(123);
$account = user_load(456);
if (node_access("update", $node, $account) === TRUE)
{
print "access";
}