ฉันจะทราบได้อย่างไรว่าผู้ใช้มีสิทธิ์ในการเข้าถึงหน้าบางหน้า?
ฉันจะทราบได้อย่างไรว่าผู้ใช้มีสิทธิ์ในการเข้าถึงหน้าบางหน้า?
คำตอบ:
หากคุณต้องการตรวจสอบว่าผู้ใช้ที่เข้าสู่ระบบในปัจจุบันมีการเข้าถึงหน้าคุณสามารถใช้รหัสต่อไปนี้:
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 ()
เหตุผลที่ฉันไม่แนะนำให้โทรไปที่ callback โดยตรงโดยตรงนั้นเป็นเพราะข้อโต้แย้งที่ต้องถูกส่งผ่านไปยังฟังก์ชั่นนั้น
รหัสที่ใช้โดย_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),
);
ในทั้งคำจำกัดความอาร์กิวเมนต์การเข้าถึงไม่รวมวัตถุผู้ใช้และnode_access ()ในกรณีนี้ใช้วัตถุผู้ใช้สำหรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน ในกรณีที่สองหนึ่งในข้อโต้แย้งคือวัตถุโหนดที่ได้รับจาก URL; ตัวอย่างเช่นหาก URL คือ example.com/node/1 ดังนั้นอาร์กิวเมนต์ที่สองที่ส่งผ่านไปยัง callback access คือวัตถุโหนดสำหรับโหนดที่มี ID โหนดเท่ากับ 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);
- ดูเอกสาร API
โทรไปaccess callback
ที่ระบุไว้ในรายการเมนูที่รับผิดชอบสำหรับหน้า รายการเมนูนั้นมักจะถูกสร้างขึ้นโดย Drupal เรียกการใช้งานhook_menu
และถูกเก็บไว้ในฐานข้อมูล ระวังว่าข้อมูลที่ส่งกลับโดยอาจจะมีการเปลี่ยนแปลงได้โดยโมดูลการดำเนินการhook_menu
hook_menu_alter
ระวังว่าบางโมดูลอาจไม่ผ่านผู้ใช้เป็นอาร์กิวเมนต์แยกต่างหาก (ตามที่ระบุโดยaccess arguments
คีย์ของรายการเมนู) แต่อาจใช้$user
วัตถุร่วมแทน คุณจะต้องตรวจสอบสิ่งนี้สำหรับแต่ละโมดูลที่คุณใช้
ตรวจสอบuser_access()
ฟังก์ชั่น ดูลิงค์สำหรับพารามิเตอร์ที่ระบุสำหรับแต่ละรุ่นของ Drupal จากหน้าเอกสารสำหรับ Drupal 7-8:
พารามิเตอร์
$ string การอนุญาตเช่น "การจัดการโหนด" กำลังถูกตรวจสอบ
บัญชี $ (ตัวเลือก) บัญชีที่จะตรวจสอบหากไม่ได้รับการใช้งานในปัจจุบันผู้ใช้เข้าสู่ระบบ
ค่าส่งคืน
บูลีน TRUE หากผู้ใช้ปัจจุบันมีสิทธิ์ที่ร้องขอ
การตรวจสอบสิทธิ์ทั้งหมดใน Drupal ควรผ่านฟังก์ชั่นนี้ ด้วยวิธีนี้เรารับประกันพฤติกรรมที่สอดคล้องกันและตรวจสอบให้แน่ใจว่า superuser สามารถดำเนินการทั้งหมดได้
user_access()
ไม่ใช่การเรียกกลับที่ใช้โดยเมนู user_access()
แม้มันจะเป็นที่คุณควรรู้ข้อโต้แย้งการเข้าถึงที่คุณต้องผ่านไป
user_access()
คิดว่า OP มีสิทธิ์ในการตรวจสอบเพื่อดูว่าผู้ใช้ควรมีการเข้าถึง ไม่ใช่คำถามที่สื่อความหมายมาก
หากคุณต้องการที่จะทราบว่าผู้ใช้สามารถเข้าถึงโหนดเฉพาะและมีการใช้โมดูลการเข้าถึงโหนดคุณสามารถใช้node_access () (หากไม่มีโมดูลการเข้าถึงโหนดพวกเขาเพียงต้องการสิทธิ์การเข้าถึงเนื้อหา
หากคุณต้องการทราบว่าผู้ใช้สามารถเข้าถึงเส้นทางที่กำหนดโดยการใช้งาน hook_menu () คุณอาจต้องดึงรายการเมนูจากฐานข้อมูลและประเมินพารามิเตอร์ 'การเรียกกลับเข้าใช้' ของมัน
$node = node_load(123);
$account = user_load(456);
if (node_access("update", $node, $account) === TRUE)
{
print "access";
}