มีมุมมองที่เกี่ยวกับ hook_node_access


14

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


หากโมดูล Views ไม่เคารพสิทธิ์การเข้าถึงที่ตั้งไว้จริงhook_node_access()ๆ มีสิ่งที่ควรทำคือการเปลี่ยนรหัสโมดูล Views
kiamlaluno

ฉันไม่คิดว่า hook ถูกไล่ออกจนกว่าโหนดจะถูกโหลดทั้งหมดด้วย node_load ดังนั้นนั่นอาจเป็นเหตุผลว่าทำไมมันยังปรากฏขึ้น อย่างไรก็ตามฉันได้เริ่มต้นทำงานกับปลั๊กอินตัวกรองที่จะใช้วิธีการเดียวกันในการกรองว่าการติดตั้ง hook_node_access () ใช้เพื่อล็อคคนอื่น ฉันจะต้องจำไว้ว่าให้เพิ่มตัวกรองนั้นในทุกมุมมองและควรใช้งานได้ ฉันจะกลับมาที่นี่พร้อมข้อมูลอีกครั้งเมื่อฉันทำเพื่อให้คนอื่นได้รับประโยชน์
nenne

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

ผมพบว่าปัญหาสำหรับมุมมองที่เกี่ยวข้องกับปัญหานี้ก็ยังหมายถึงวิธีการที่เหมาะสมในการแก้ปัญหา: drupal.org/node/1266388
nenne

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

คำตอบ:


6

ฉันมีคำถามเดียวกันขณะที่ผ่านมาที่นี่

hook_node_accessไม่ได้รับการยอมรับจากหรือviews menusมันควรจะใช้เป็นแนวป้องกันสุดท้าย

วิธีที่ดีกว่าที่จะควบคุมการเข้าถึงโหนดคือผ่านhook_node_access_recordsและhook_node_grantsตามที่อธิบายไว้ที่นี่และ ที่นี่



1

Views ใช้ SQL เพื่อกำหนดโหนดที่จะแสดง น่าเศร้าด้วยเหตุผลด้านประสิทธิภาพมันจึงไม่น่าเป็นไปได้ที่ Drupal จะดำเนินการ node_load กับผู้สมัครที่มีศักยภาพทั้งหมดแล้วจึงเรียกใช้ hook_node_access ในแต่ละรายการของพวกเขาทั้งหมด ลองนึกภาพมุมมองที่แสดงหลายพันโหนด (โดยเฉพาะอย่างยิ่งเมื่อใช้เพจเจอร์) หากตรรกะไม่ได้ทำใน SQL แล้ววิทยุติดตามตัวจะมีฟังก์ชั่นที่ผิดปกติอย่างมากดังนั้น Drupal บังคับให้คุณทำตามที่ระบุไว้โดยใช้บันทึกการเข้าถึงในฐานข้อมูลของคุณ

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

โดยวิธีการบันทึกการเข้าถึงจะถูกเก็บไว้ในตารางnode_accessตารางที่เห็นด้านล่าง: ป้อนคำอธิบายรูปภาพที่นี่ ผ่านความคิดเห็นสำหรับแต่ละคอลัมน์ที่คุณสามารถเข้าใจวัตถุประสงค์ของพวกเขา คิดถึง realm เป็นระบบที่ใช้สำหรับการเข้าถึงโหนดและ gid เป็นกลุ่มภายใน realm กลุ่มนั้นสามารถมีสิทธิ์ดูอัปเดตและลบได้ โดยทั่วไปแต่ละโมดูล node_access กำหนดหนึ่งหรือมากกว่าหนึ่งอาณาจักร (บางครั้งหลายโมดูล node_access สามารถทำงานแบบขนาน) ผู้ใช้มีหนึ่งหรือมากกว่าหนึ่ง gids ในแต่ละอาณาจักร

ใน Drupal การค้นหาทั้งหมดที่มีแท็ก "node_access" จะมีการเพิ่มตรรกะพิเศษบางอย่างโดยอัตโนมัติ ดูเอกสารประกอบเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการติดแท็ก ตรรกะพิเศษนี้รวมตาราง "node_access" สำหรับแต่ละ realm และเพิ่มเงื่อนไขที่ซึ่ง "gid" เท่ากับหนึ่งใน gids ที่ใช้กับผู้ใช้ผู้ใช้มีสิทธิ์ที่เหมาะสม

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

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