ฉันจะกำหนดการเข้าถึงบล็อกโดยทางโปรแกรมอย่างไร


10

ฉันสร้างบล็อกโดยทางโปรแกรม แต่ไม่รู้ว่าฉันจะกำหนดสิทธิ์การเข้าถึงให้กับโปรแกรมได้อย่างไร ฉันจะทำให้สำเร็จได้อย่างไร


คุณสามารถขยายคำถามและแสดงรหัสของคุณได้หรือไม่?
Triskelion

ในโค้ดบล็อกนั้นคุณสามารถค้นหาผู้ใช้ (ผู้ใช้ $ ทั่วโลก) และตรวจสอบบทบาทของพวกเขาโดยใช้วิธีในลิงก์ bywombats.com/blog/ryan/10-25-2007/…
6614

โมดูลพาเนลมีการควบคุมการเข้าถึงที่ยอดเยี่ยมโดยใช้พื้นที่ไม่ใช่บล็อก
หลุยส์

คำตอบ:


10

การตั้งค่าอาร์เรย์ "role" ในอาร์เรย์ที่ส่งคืนจากhook_block_info()ไม่ทำงานเนื่องจาก:

  • บทบาทที่ได้รับอนุญาตให้ดูบล็อกและตั้งอยู่ในส่วนต่อประสานผู้ใช้จะถูกบันทึกจากblock_admin_configure_submit ()ในตาราง "block_role"

    $query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
    foreach (array_filter($form_state['values']['roles']) as $rid) {
      $query->values(array(
        'rid' => $rid,
        'module' => $form_state['values']['module'],
        'delta' => $form_state['values']['delta'],
      ));
    }
    $query->execute();
  • รหัสที่ตัดสินใจว่าบล็อกใดที่ควรแสดงต่อผู้ใช้ที่เข้าสู่ระบบในปัจจุบันนั้นมีอยู่ในblock_block_list_alter ()ซึ่งเป็นการใช้งานของhook_block_list_alter ()และใช้เฉพาะเนื้อหาของตารางนั้น

    $result = db_query('SELECT module, delta, rid FROM {block_role}');
    foreach ($result as $record) {
      $block_roles[$record->module][$record->delta][] = $record->rid;
    }
    
    foreach ($blocks as $key => $block) {
      if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
        // This block was added by a contrib module, leave it in the list.
        continue;
      }
    
      // If a block has no roles associated, it is displayed for every role.
      // For blocks with roles associated, if none of the user's roles matches
      // the settings from this block, remove it from the block list.
      if (isset($block_roles[$block->module][$block->delta]) && !array_intersect($block_roles[$block->module][$block->delta], array_keys($user->roles))) {
        // No match.
        unset($blocks[$key]);
        continue;
      }
    
      // …
    
    }
  • ไม่มีอีกฟังก์ชั่น Drupal ที่ตรวจสอบคุณสมบัติบทบาทในข้อมูลที่ส่งคืนจากhook_block_info()และไม่มีเนื้อหาของตาราง "block_role" ที่ผสานกับสิ่งที่ส่งคืนจากhook_block_info()การนำไปใช้งาน

คุณสามารถตรวจสอบว่าผู้ใช้มีบทบาทที่จำเป็นในการดูบล็อกhook_block_view()แต่ ณ จุดนั้น Drupal กำลังแสดงบล็อกอยู่แล้ว นั่นหมายความว่าผู้ใช้จะยังคงเห็นชื่อบล็อกหากมีการตั้งค่าไว้แล้ว

สิ่งที่คุณสามารถทำได้คือการนำhook_block_list_alter()ไปใช้เพื่อลบข้อมูลเกี่ยวกับบล็อกนั้นเมื่อผู้ใช้ไม่มีบทบาทที่ต้องการ
เพื่อหลีกเลี่ยงความสับสนของผู้ใช้ที่ดูแลบล็อกฉันจะแก้ไขฟอร์มที่ใช้ในการแก้ไขบล็อกและปิดการใช้งานฟิลด์แบบฟอร์มที่ใช้เพื่อกำหนดบทบาทที่สามารถเห็นบล็อกนั้นเนื่องจากโมดูลที่ใช้มันจะใช้รายการของตัวเอง ของบทบาท อย่างน้อยโค้ดขั้นต่ำควรแสดงข้อความเกี่ยวกับการตั้งค่าบทบาทที่ไม่มีผลกระทบใด ๆ แต่ฉันจะปิดใช้งานองค์ประกอบแบบฟอร์มสำหรับการตั้งค่าบทบาทด้วย

เนื่องจากโมดูลบล็อกแสดงฟิลด์แบบฟอร์มเพื่อเลือกบทบาทที่เห็นบล็อกอยู่แล้วคุณสามารถตั้งค่าเริ่มต้นสำหรับบล็อกของคุณและให้ผู้ใช้ผู้ดูแลระบบเปลี่ยนได้ถ้าจำเป็น

ภาพหน้าจอ

ตามการตรวจสอบบทบาทที่ผู้ใช้มีเมื่อเทียบกับการตรวจสอบสิทธิ์ที่ผู้ใช้มีอยู่เป็นที่ต้องการอย่างยิ่งโดยเฉพาะอย่างยิ่งเมื่อทางเลือกอื่นจะเข้ารหัสรายการของบทบาทในโมดูลอย่างหนัก
ดังที่แสดงจากโมดูลบล็อกการใช้สิทธิ์ไม่ใช่ทางเลือกอื่นเท่านั้น: โมดูลอาจมีการตั้งค่าสำหรับการตัดสินใจว่าบทบาทใดที่ได้รับอนุญาตให้เห็นบางสิ่งบางอย่าง
เห็นได้ชัดว่ามันไม่คุ้มที่จะมีการตั้งค่าสำหรับบทบาทที่อนุญาตให้ทำบางสิ่งบางอย่าง ฉันจินตนาการด้วยว่าผู้ใช้ที่เป็นผู้ดูแลระบบนั้นหมายความว่าอย่างไรหาก 10 โมดูลจะมีการตั้งค่าของตัวเองสำหรับบทบาทที่ได้รับอนุญาตให้ทำบางสิ่งแทนที่จะใช้สิทธิ์และอนุญาตให้ผู้ใช้ผู้ดูแลระบบใช้หน้าเดียวในการตั้งค่า


เห็นได้ชัดว่าฉันจะต้องไปกับคนนี้เป็นคำตอบที่เหมาะสมที่สุด ขอบคุณสำหรับคำอธิบายโดยละเอียดเนื่องจากช่วยให้เข้าใจได้ดีว่า Drupal บล็อกทำงานอย่างไรเบื้องหลัง
user5013

1

ใน hook_block_info ของคุณคุณสามารถลองดังนี้:

$blocks['myblock'] = array(
   ...
   'roles' => array(
      'administrator' => '3',
      'authenticated user' => '2',
   )

นี่ดูเหมือนจะเป็นวิธีที่ดีที่สุดในการใช้งานโดยใช้วิธีการเขียนโปรแกรมในขณะที่คุณกำหนดบทบาทที่มีการเข้าถึงจากนั้นให้ Drupal พิจารณาว่าผู้ใช้สามารถเข้าถึงได้หรือไม่ ฉันพลาดข้อเสียของวิธีนี้หรือไม่?
user5013

หากคุณต้องทำโดยทางโปรแกรมใช่ ไม่มีข้อเสีย อย่างไรก็ตามฉันคิดว่าจะต้องมีกรณีการใช้งานที่ดีมากเพียงไปที่/ admin / โครงสร้าง / บล็อกและกำหนดบทบาทให้กับบล็อก
Triskelion

กรณีการใช้งานจะทำการตั้งค่าโดยอัตโนมัติสำหรับผู้ใช้ดังนั้นพวกเขาไม่จำเป็น ปัญหาเรื่องความสะดวกสบายอย่างเคร่งครัด เมื่อตั้งค่าแล้วพวกเขาสามารถเปลี่ยนเป็นสิ่งที่พวกเขาต้องการได้หากมันไม่เหมาะกับความต้องการเฉพาะของพวกเขา
user5013

1
มันใช้งานไม่ได้ ดูคำตอบของฉันสำหรับสาเหตุที่มันไม่
kiamlaluno

0

สมมติว่าคุณกำลังสร้างบล็อกด้วย hook_block_info () จากนั้นคุณสามารถทำ user_access () ในฟังก์ชั่น hook_block_view () ของคุณ ตรวจสอบapi docsเนื่องจากพวกเขามีตัวอย่างนี้


ใช่ฉันควรนึกถึงการใช้ user_access จิตใจของฉันลื่นลงอย่างสิ้นเชิง - D'oh ฉันคิดเกี่ยวกับการใช้การเข้าถึงบทบาท แต่บางทีการเข้าถึงการอนุญาตอาจเป็นวิธีที่ดีกว่า
user5013

0

เป็นไปไม่ได้ใน hook_block_info () แต่คุณสามารถใช้แบบสอบถามนี้เพื่อให้ได้สิ่งนี้ เปลี่ยน MODULE_NAME, BLOCK_DELTA และ RID ตามลำดับ

$query = db_insert('block_role')
  ->fields(array(
    'module' => 'MODULE_NAME', 
    'delta' => 'BLOCK_DELTA', 
    'rid' => 2, // Authenticated User
  ))
  ->execute();

0

ใน hook_block_view คุณสามารถใช้global $userเพื่อรับข้อมูลเกี่ยวกับผู้ใช้จากนั้นขึ้นอยู่กับบทบาทของผู้ใช้ที่คุณสามารถกำหนดให้แตกต่างกันblock['subject']และblock['content']หรือไม่ได้กำหนดหัวเรื่องและเนื้อหาใด ๆ เพื่อบล็อกหากไม่สามารถมองเห็นบทบาทนั้นได้ นี่คือตัวอย่าง:

function ModuleNAME_block_view($delta = '') {
  switch ($delta) {
    case 'Your_BLOCK' :
      Global $user;
      if($user->uid != '0') {
        $block['subject'] = 'SUBJECT';
        $block['content'] = 'SOME CONTENT OR A FUNCTION FOR BLOCK';
      }
      break;
  }
  return $block;
}

การใช้รหัสผู้ใช้ที่ได้รับการรับรองความถูกต้อง (ไม่ใช่แขก) จะมีการเปิดเผยบล็อกสำหรับผู้ใช้ที่ได้รับการรับรองความถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.