Score:2

ส่งคืน AccessDenied สำหรับเพจที่กำหนดเอง

ธง mw

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

ฉันพบ หน้านี้ ซึ่งแสดงวิธีตั้งค่าตัวควบคุมการเข้าถึงแบบกำหนดเอง แต่ตัวอย่างนี้กำลังส่งเอนทิตีผู้ใช้ เมื่อฉันสนใจมากกว่าคือ 'ตัวทาก' ของ URL ที่พวกเขาโดน

routing.yml

my_module.user_subscribe:
  เส้นทาง: /my-module/subscribe/{entity_type}/{entity_id}
  ค่าเริ่มต้น:
    _controller: \Drupal\my-module\Controller\SubscriptionPages::สมัครสมาชิก
    _title: การสมัครสมาชิกทางอีเมลสำเร็จ
    ชนิด: โหนด
    นิติบุคคล: 1
  ความต้องการ:
    _permission: 'เข้าถึงเนื้อหา'
    _entity_check: 'จริง'

บริการ.yml

บริการ:
  my_module.entity_check:
    คลาส: Drupal\my-module\Access\EntityCheck
    แท็ก:
      - { ชื่อ: access_check, apply_to: _entity_check }

แล้วฉันมีของฉัน src/Controller/SubscriptionPages ไฟล์และหนึ่งไฟล์สำหรับ src/Access/EntityCheck ฯลฯ ทุกส่วนนั้นดูเหมือนจะใช้งานได้ ฉันสามารถบังคับใช้รหัสด้วยตนเองใน EntityCheck ของฉันเพื่อส่งคืนการเข้าถึงที่ถูกปฏิเสธและทำได้ แต่สิ่งที่ฉันต้องการทราบคือฉันจะดึง {entity_type} และ {entity_id} จาก URL ที่พวกเขาเข้าชม เพื่อให้ฉันตรวจสอบได้ว่าพวกเขาไม่ได้พยายามเข้าถึงสิ่งที่ไม่ควร

เช่น

mywebsite.com/my-module/subscribe/node/15 - ก็ใช้ได้

mywebsite.com/my-module/subscribe/foo/bar - จะปฏิเสธการเข้าถึงกลับ เนื่องจากฉันต้องการเรียกใช้การตรวจสอบภายในรหัส EntityCheck ของฉัน

ในลิงค์ด้านบนก็มี อาร์กิวเมนต์: ['@current_user'] ภายในไฟล์ services.yml มี URL ที่เทียบเท่าสำหรับ URL ปัจจุบันหรือไม่ หรือมี URL ใดที่ฉันสามารถดึงข้อมูลแต่ละรายการแยกกันได้โดยเฉพาะเจาะจงมากขึ้น

Score:3
ธง de

ในเส้นทางของคุณแทน _การอนุญาตคุณสามารถใช้การเรียกกลับการเข้าถึงแบบกำหนดเอง:

_custom_access: Drupal\[MODULE]\Controller::accessCallback()

จากนั้นคุณสามารถส่งคืน AccessResult จากการโทรกลับเข้าใช้งาน:

ฟังก์ชันสาธารณะ accessCallback ($entity_type, $entity_id) {
  ถ้า (!in_array($entity_type, $allowed_types)) {
    กลับ \Drupal\Core\Access\AccessResult::forbidden();
  }

  ...

  กลับ \Drupal\Core\Access\AAccessResult::neutral();
}

หรือคุณสามารถใช้ _การอนุญาต บนเส้นทางและแทนที่จะโยน Symfony\Component\HttpKernel\Exception\NotFoundHttpException ข้อยกเว้นจากตัวควบคุมหากค่าไม่ถูกต้อง:

ฟังก์ชั่นสาธารณะ someRouteCallback ($entity_type, $entity_id) {
  ถ้า (!$entity = \Drupal::entityTypeManager()->getStorage($entity_type)->load($entity_id)) {
    โยนใหม่ \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
  }
}
Andrew Morris avatar
mw flag
อา สมบูรณ์แบบ ดียิ่งขึ้น ขอบคุณ
4uk4 avatar
cn flag
โปรดทราบว่าการเรียกกลับการเข้าถึงอาจถูกเรียกด้วยเหตุผลต่างๆ กัน และควรส่งคืนผลลัพธ์การเข้าถึง ไม่ใช่ดำเนินการใดๆ คุณสามารถโยนข้อยกเว้นในคอนโทรลเลอร์ได้ ซึ่งไม่มีปัญหา แต่ก็ไม่เหมาะ นี่คือการเรียกกลับการเข้าถึงที่ส่งคืนผลลัพธ์การเข้าถึง จากนั้นรหัสใด ๆ ที่ตรวจสอบการเข้าถึงเส้นทางจะทำงานตามที่ควร
Jaypan avatar
de flag
อ๊ะ ขอบคุณ ฉันกำลังผสมสิ่งต่างๆ ฉันได้อัปเดตโพสต์ตามนั้นแล้ว Andrew Morris คุณควรตรวจสอบการอัปเดตของฉันและเปลี่ยนรหัสของคุณตามนั้น

โพสต์คำตอบ

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