จำกัด บทบาทที่สามารถดูโหนดที่ขึ้นอยู่กับประเภทเนื้อหา


18

ฉันใช้ Drupal 7 และฉันสร้างประเภทเนื้อหาใหม่ที่เรียกว่า "eBook" และฉันได้สร้างบทบาทใหม่ที่เรียกว่า "MonthlySubscriber" ความตั้งใจของฉันคือการอนุญาตเฉพาะผู้ใช้ที่มี "MonthlySubscriber" เพื่อดูโหนด "eBook" เมื่อฉันดูการตั้งค่าการอนุญาตสำหรับบทบาทฉันเห็นช่องทำเครื่องหมายที่อนุญาตให้สร้างแก้ไขและลบโหนดของประเภทเนื้อหานั้น แต่ไม่มีช่องทำเครื่องหมายสำหรับดูโหนด

ฉันจะ จำกัด ผู้ใช้ที่สามารถดูโหนด "eBook" ได้เฉพาะผู้ใช้ที่มีบทบาท "MonthlySubscriber" อย่างไร

คำตอบ:


13

คุณต้องติดตั้งโมดูลการเข้าถึงเนื้อหาเพื่อเพิ่มการควบคุมการเข้าถึงนี้

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


5

สำหรับ drupal 7 ลองใช้hook_node_access () :

/**
 * Implements hook_node_access().
 */
function YOURMODULE_node_access($node, $op, $account) {
  if (
    $node->type == 'ebook' &&
    $op == 'view' &&
    !in_array('MonthlySubscriber', $account->roles)
  ) { return NODE_ACCESS_DENY; }
  return NODE_ACCESS_IGNORE;
}

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

นี่ควรเป็นคำตอบที่ถูกต้อง
GrafiCode

5

นี่เป็นวิธีที่ง่ายในการปกป้องหน้าโหนด (node ​​/ NID) จากผู้ใช้ที่ไม่มีสิทธิพิเศษ

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  $items['node/%node']['access callback'] = 'mymodule_check_node_access';
}

/**
 * Determines whether the current user may perform the operation on the node.
 */
function mymodule_check_node_access($op, $node) {
  if ($node->type == 'protected_type' && !user_access('administer site configuration')) {
    return FALSE;
  }
  return node_access($op, $node);
}

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

รหัสของคุณใช้ไม่ได้สำหรับฉัน แต่คุณชี้ให้ฉันในทิศทางที่ถูกต้อง ฉันพบรหัสการทำงานบนเอกสารประกอบhook_node_access api.drupal.org/api/drupal/modules%21node%21node.api.php/ …
Camilo

นี่เป็นตัวอย่างที่ไม่ดีเนื่องจากใช้ mymodule_node_access เป็นฟังก์ชันที่กำหนดเองในขณะที่ Drupal มี hook_node_access สิ่งนี้อาจทำให้เกิดความสับสน
batigolix

@batigolix ตามที่ระบุไว้ในคำตอบมันเป็นวิธีการป้องกันหน้าโหนดไม่ใช่โหนด
ya.teck



0

โซลูชั่น hook_menu_alter ที่โพสต์ไว้ด้านบนโดย ya.teck ทำงานได้ แต่ขัดแย้งกับ hook_node_access มาตรฐานในชื่อฟังก์ชัน hook_menu_alter ไม่จำเป็นต้องใช้ในกรณีนี้ดังนั้นคำตอบที่เดนิสโพสต์ไว้นั้นเป็นความเห็นของฉันที่ถูกต้องและเหมาะสมกว่า การเปลี่ยนแปลง menu_item ตามที่ทำคือตัวอย่างที่อ้างอิงแรกอาจถูกปิดกั้นโดยโมดูลอื่นที่อยู่ถัดจากไพพ์


0

ผมใช้ข้อมูลโค้ดที่พบในเอกสาร API D7 สำหรับเบ็ด hook_node_access

รหัสนี้จะให้สิทธิ์การเข้าถึงเพื่อดูเนื้อหา "ebook" ให้กับผู้ใช้ที่ได้รับอนุญาต "ดู ebook"

คุณต้องได้รับอนุญาตใหม่เพื่อควบคุมการเข้าถึงโดยใช้ hook_permission ()

/**
 * Implements hook_permission().
 */
function mymodule_permission() {
  return array(
    'view ebook' => array(
      'title' => t('View Ebook'),
      'description' => t('View Ebook nodes.'),
    ),
  );
}

โดยการใช้ hook_node_access () Drupal สามารถให้หรือปฏิเสธการเข้าถึงโหนด

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {

  // Checks for an ebook node in view mode.
  if (is_object($node) && $node->type === 'ebook' && $op === 'view') {

    // Grants permission to view the node if the current user has an role
    // with the permission 'view ebook'.
    if (user_access('view ebook')) {
      return NODE_ACCESS_ALLOW;
    }

    // Otherwise disallows access to view the node.
    return NODE_ACCESS_DENY;
  }
  // For all other nodes and other view modes, don't affect the access.
  return NODE_ACCESS_IGNORE;
}

การอนุญาตอื่น ๆ (แก้ไขลบ ฯลฯ ) สามารถทำได้ผ่านการอนุญาตแบบปกติของ Drupal

คุณสามารถลบเนื้อหาออกจากภาพรวมผู้ดูแลระบบได้โดยใช้ hook_query_TAG_NAME_alter

/**
 * Implements hook_query_TAG_NAME_alter().
 */
function mymodule_query_node_admin_filter_alter(QueryAlterableInterface $query) {
  if (!user_access('view ebook')) {
  $query->condition('n.type', 'ebook', '!=');
  }
}

0

ผมประสงค์ใช้โหนดดูสิทธิ์โมดูล มันง่ายกว่าโมดูลการเข้าถึงเนื้อหา

เช่นเดียวกับใน D6 จะเพิ่มสิทธิ์ "ดูเนื้อหาใด ๆ " และ "ดูเนื้อหาของตัวเอง" ให้กับประเภทเนื้อหาใด ๆ ที่คุณเลือก

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนในการปฏิบัติตาม:

  1. หลังจากติดตั้งและเปิดใช้งานไปที่ /admin/config/content/node-view-permissionsและเลือกประเภทเนื้อหาที่คุณต้องการ จำกัด การเข้าถึง
  2. จากนั้นไปที่/admin/people/permissions#module-node_view_permissions และเลือกบทบาทที่คุณต้องการให้สามารถดูเนื้อหา บันทึกการอนุญาต

    ทำ!


สำหรับ drupal 8 "การอนุญาตให้ใช้สิทธิ์ในการดูโหนด" ไม่ทำงาน
Karthikeyan Manivasagam

@KarthikeyanManivasagam เป็นไงบ้าง?
Chris Happy

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