it-swarm.asia

تحقق مما إذا كان المستخدم لديه حق الوصول إلى صفحة معينة

كيف يمكنني تحديد ما إذا كان المستخدم لديه إذن للوصول إلى صفحة معينة؟

23
farzan

إذا كنت تريد التحقق مما إذا كان المستخدم الذي قام بتسجيل الدخول حاليًا لديه حق الوصول إلى صفحة ، فيمكنك استخدام الكود التالي:

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 () هو الكود التالي (دروبال 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),
);

في كلا التعريفين ، لا تتضمن وسيطات الوصول كائن مستخدم ، و node_access () في هذه الحالة يستخدم كائن المستخدم للمستخدم الذي قام بتسجيل الدخول حاليًا. في الحالة الثانية ، تكون إحدى الحجة هي كائن العقدة الذي يتم الحصول عليه من عنوان URL ؛ على سبيل المثال ، إذا كان عنوان URL هو example.com/node/1 ، فإن الوسيطة الثانية التي تم تمريرها إلى رد اتصال الوصول هي كائن العقدة للعقدة بمعرف العقدة يساوي 1.
كتابة التعليمات البرمجية التي تتعامل مع هذه الحالات يعني أيضًا تكرار التعليمات البرمجية الموجودة بالفعل في دروبال. حتى إذا قمت بتكرار هذا الرمز ، فستظل هناك مشكلة عمليات استدعاء الوصول التي تتحقق من الوصول مقابل المستخدم المسجل حاليًا.

إذا كنت ترغب في التحقق مما إذا كان بإمكان المستخدم الذي ليس المستخدم الذي قام بتسجيل الدخول حاليًا الوصول إلى القائمة ، فيجب أولاً تغيير قيمة المتغير العام $user ، استخدم الرمز الذي أبلغت عنه في بداية إجابتي ، ثم استعد قيمة $user. لكيفية تغيير قيمة العالمية $user ، يمكنك مشاهدة انتحال صفة مستخدم آخر برمجيًا دون التسبب في تسجيل خروج المستخدم الذي سجّل الدخول حاليًا . الفرق هو أنه بدلاً من استخدام القيمة التي تم إرجاعها من drupal_anonymous_user () ، فإنك تستخدم القيمة التي تم إرجاعها من ser_load () .

25
kiamlaluno

حاول drupal_valid_path () .

تقوم الدالة بإرجاع TRUE هو المسار الذي تم تمريره عند وجود الوسيطة ولدى المستخدم الحالي حق الوصول إليها. لذا ، إذا كنت تعمل على Drupal 7 وتحتاج إلى التحقق من الوصول إلى المستخدم المسجل حاليًا ، فهذه هي أسهل طريقة للذهاب:

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

اتصل ب access callback المحدد في إدخال القائمة المسؤول عن الصفحة. عادة ما يتم إنشاء إدخال القائمة هذا عن طريق Drupal استدعاء تنفيذ hook_menu ويتم تخزينها في مكان ما في قاعدة البيانات. احذر من أن البيانات التي أرجعتها hook_menu قد يتم تغييره بواسطة وحدة تنفيذ hook_menu_alter .

احذر من أن بعض الوحدات قد لا تمرر المستخدم كوسيطة منفصلة (كما هو محدد في access arguments مفتاح إدخال القائمة) ، ولكن قد يستخدم بدلاً من ذلك المفتاح العام $user كائن بدلاً من ذلك. سيكون عليك التحقق من ذلك لكل وحدة نمطية تستخدمها.

3
Oswald

تحقق من الوظيفة user_access() . انظر الرابط للمعلمات المحددة لكل إصدار من دروبال. من صفحة التوثيق لـ Drupal 7-8:

معلمات

سلسلة $ الإذن ، مثل "إدارة العقد" ، يتم التحقق منه.

حساب $ (اختياري) الحساب الذي يجب التحقق منه ، إذا لم يتم منح المستخدم المستخدم المسجل حاليًا.

قيمة الإرجاع

قيمة منطقية إذا كان المستخدم الحالي لديه الإذن المطلوب.

يجب أن تخضع جميع عمليات الإذن في Drupal من خلال هذه الوظيفة. وبهذه الطريقة ، نحن نضمن سلوكًا متسقًا ، ونضمن قدرة المستخدم الفائق على تنفيذ جميع الإجراءات.

2
Laxman13

إذا كنت بحاجة إلى معرفة ما إذا كان يمكن للمستخدم الوصول إلى عقدة معينة ، وكنت تستخدم وحدة وصول إلى العقدة ، فيمكنك استخدام node_access () . (بدون وحدة وصول إلى العقدة ، يحتاجون فقط إلى إذن "الوصول إلى المحتوى".)

إذا كنت ترغب في معرفة ما إذا كان يمكن للمستخدم الوصول إلى مسار عشوائي تم تعريفه بواسطة تطبيق hook_menu () ، فقد تضطر إلى استرداد إدخال القائمة من قاعدة البيانات وتقييم معلمة "رد الاتصال" الخاصة به.

2
gapple
    $node = node_load(123);

    $account = user_load(456);

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

         print "access";    
    }
2
Mahipal Purohit