ACL ของแผนที่

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

สร้าง ACL

การสร้าง ACL เป็นกระบวนการที่มี 2 ขั้นตอน ดังนี้

  1. สร้าง Principal โดยใช้เมธอดแบบคงที่ในคลาส ACL
  2. ใช้คลาส Acl.Builder เพื่อสร้าง ACL โดยผู้ใช้หลัก

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

สร้างผู้ใช้หลักโดยใช้รหัสภายนอก

Google Cloud Search กำหนดให้ผู้ใช้และกลุ่มแก้ไขอีเมล Google เมื่อจัดทำดัชนีรายการที่เก็บ เครื่องมือเชื่อมต่อเนื้อหาอาจไม่มีอีเมลเหล่านี้ อย่างไรก็ตาม SDK เครื่องมือเชื่อมต่อเนื้อหาอนุญาตให้คุณใช้รหัสภายนอกใดก็ได้ (รหัสที่ให้สิทธิ์ผู้ใช้หรือกลุ่มในการเข้าถึงรายการที่เก็บ) เพื่อจัดทำดัชนีรายการ แทนที่จะใช้อีเมล ใช้เมธอด getUserPrincipal() หรือเมธอด getGroupPrincpal() เพื่อสร้างผู้ใช้หลักที่มีรหัสภายนอก มีเมธอดแบบคงที่อื่นๆ อีกหลายวิธีในคลาส ACL ที่ใช้สร้างออบเจ็กต์ Principal

การรับช่วงค่า ACL

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

ตั้งค่าการรับช่วงค่า

แต่ละรายการจะมีผู้ใช้หลักที่อนุญาตโดยตรงและผู้ใช้หลักที่ถูกปฏิเสธโดยตรงได้ ซึ่งต้องระบุโดยใช้เมธอด setReaders() และ setDeniedReaders() ผู้ใช้หลักที่ได้รับอนุญาตโดยตรงคือผู้ใช้ที่ระบุใน ACL ซึ่งให้สิทธิ์เข้าถึงรายการที่เจาะจงโดยตรง ผู้ใช้หลักที่ถูกปฏิเสธโดยตรงคือผู้ใช้ที่ระบุใน ACL ว่าไม่มีสิทธิ์เข้าถึงรายการที่เฉพาะเจาะจง

รายการอาจรับค่าผู้ใช้หลักที่อนุญาตโดยอ้อมและผู้ใช้หลักที่ถูกปฏิเสธโดยอ้อมโดยใช้เมธอด setInheritFrom() ผู้ใช้หลักโดยอ้อมที่อนุญาตคือผู้ใช้ที่มีสิทธิ์เข้าถึงรายการหนึ่งๆ โดยอ้อมผ่านการรับช่วงค่า ACL ผู้ใช้หลักที่ถูกปฏิเสธโดยอ้อมคือผู้ใช้ที่ถูกปฏิเสธการเข้าถึงรายการที่เฉพาะเจาะจงผ่านการรับค่า ACL

รูปที่ 1 แสดงวิธีการใช้เมธอด setInheritFrom() เพื่อรับผู้ใช้หลักที่อนุญาตและถูกปฏิเสธโดยอ้อม

การวาดเส้นเชื่อมต่อระหว่างรายการ
รูปที่ 1 เมธอด setInheritFrom()

การควบคุมการเข้าถึงเหล่านี้แสดงอยู่ในรูปที่ 1 ดังนี้

  • ผู้ใช้ 1 เป็นผู้ใช้หลักที่อนุญาตโดยตรงของรายการ A
  • ผู้ใช้ 2 เป็นผู้ใช้หลักที่อนุญาตโดยตรงของรายการ B
  • รายการ B รับค่า ACL ของรายการ A

กฎการเข้าถึงจะขึ้นอยู่กับการควบคุมการเข้าถึง ดังนี้

  • ผู้ใช้ 1 ไม่จำเป็นต้องระบุอย่างชัดแจ้งเป็นผู้ใช้หลักของรายการ B เพื่อให้เป็นผู้ใช้หลักที่อนุญาตโดยอ้อมของรายการ B สิทธิ์เข้าถึงจะรับค่าเดิมเพราะผู้ใช้ 1 เป็นผู้ใช้หลักที่ได้รับอนุญาตโดยตรงของรายการ A และรายการ B จะรับค่า ACL จากรายการ A
  • ผู้ใช้ 2 ไม่ใช่ผู้ใช้หลักโดยอ้อมที่อนุญาตของรายการ A

ตั้งค่าประเภทการรับช่วง

หากคุณตั้งค่าการรับช่วงมาโดยใช้เมธอด setInheritFrom() คุณต้องตั้งค่าประเภทการรับช่วงโดยใช้เมธอด setInheritanceType() ประเภทการรับช่วงค่าจะกำหนดวิธีรวมข้อมูล ACL ของ ACL ของผู้เผยแพร่โฆษณาย่อยกับ ACL ของระดับบนสุด Acl.InheritanceType ใช้การรับช่วง 3 ประเภทดังนี้

  • BOTH_PERMIT - ตั้งค่าประเภทการรับช่วงเป็น BOTH_PERMIT เพื่อให้สิทธิ์ผู้ใช้เข้าถึงรายการได้ต่อเมื่อทั้ง ACL ของรายการย่อยและ ACL ของรายการที่รับค่ามาของระดับบนสุดอนุญาตให้ผู้ใช้นั้นเข้าถึงรายการนั้น

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

  • PARENT_OVERRIDE - ตั้งค่าประเภทการรับช่วงเป็น PARENT_OVERRIDE เพื่อบังคับให้ ACL ของรายการระดับบนสุดมีผลเหนือกว่า ACL ของรายการย่อยเมื่อมีข้อขัดแย้ง ดังนั้นหาก ACL ของรายการย่อยปฏิเสธการเข้าถึงผู้ใช้ในฐานะผู้อ่านที่ถูกปฏิเสธ ผู้ใช้จะยังคงสามารถเข้าถึงได้ถ้าเขามีสิทธิ์เข้าถึงรายการหลักในฐานะผู้อ่าน ในทางกลับกัน แม้ว่า ACL ของรายการย่อยจะให้สิทธิ์เข้าถึงแก่ผู้ใช้ แต่ผู้ใช้จะไม่มีสิทธิ์เข้าถึงหากเป็นผู้อ่านที่ถูกปฏิเสธของรายการหลัก

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

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

การลบคลังสินค้าและสินค้า

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

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

การควบคุมการเข้าถึงเหล่านี้แสดงอยู่ในรูปที่ 2 ดังนี้

  • ผู้ใช้ 1 เป็นผู้ใช้หลักที่อนุญาตโดยตรงของรายการ A
  • ผู้ใช้ 2 เป็นผู้ใช้หลักที่อนุญาตโดยตรงของรายการ B
  • ผู้ใช้ 3 เป็นผู้ใช้หลักที่ได้รับอนุญาตโดยตรงของรายการ C
  • รายการ C รับค่า ACL ของรายการ A
  • รายการ ข ตั้งชื่อรายการ ก. เป็นคอนเทนเนอร์
  • รายการ ค ตั้งชื่อรายการ B เป็นคอนเทนเนอร์

กฎการเข้าถึงจะขึ้นอยู่กับการควบคุมการเข้าถึง ดังนี้

  • สิทธิ์เข้าถึงโดยอ้อมมาจากเมธอด setInheritFrom() ดังนั้น ผู้ใช้ 1 สามารถเข้าถึงรายการ C ได้เนื่องจากรายการ C จะรับค่า ACL ของรายการ A
  • การเข้าถึงโดยอ้อมไม่ได้มาจากรายการ C ที่อยู่ในรายการ B ดังนั้น ผู้ใช้ 2 จึงไม่สามารถเข้าถึงรายการ C
การวาดเส้นเชื่อมต่อระหว่างรายการ
รูปที่ 2 เมธอด setInheritFrom() ที่ใช้อยู่

การแยกการรับช่วงค่า ACL จากลำดับชั้นการยับยั้งช่วยให้คุณทำโมเดลโครงสร้างที่มีอยู่จำนวนมากได้

เมื่อลบรายการเรียบร้อยแล้ว สิ่งที่จะเกิดขึ้นมีดังนี้

  • รายการที่มีรายการที่ถูกลบจะไม่สามารถค้นหาได้และมีการกำหนดเวลาให้ระบบลบจากแหล่งข้อมูลของ Google
  • คุณจะค้นหารายการที่ระบุรายการที่ถูกลบโดยใช้เมธอด setInheritFrom() ไม่ได้

หากทรัพยากรมีรายการที่ลบแล้วโดยใช้เมธอด setInheritFrom() แต่ไม่มีชุดคอนเทนเนอร์ที่ใช้ setContainer() หรือลำดับชั้นการควบคุมไม่มีรายการที่ลบไปแล้ว รายการนั้นและข้อมูลจะยังคงอยู่ในแหล่งข้อมูลของ Google คุณต้องรับผิดชอบในการลบรายการดังกล่าว

รูปที่ 3 แสดงตัวอย่างวิธีการทำงานของการลบในลำดับชั้นรายการ

การวาดเส้นเชื่อมต่อระหว่างรายการ
รูปที่ 3 การลบรายการและการรับช่วงค่า ACL

การควบคุมการเข้าถึงเหล่านี้แสดงอยู่ในรูปที่ 3

  • ผู้ใช้ 1 เป็นผู้ใช้หลักที่อนุญาตโดยตรงของรายการ A
  • ผู้ใช้ 2 เป็นผู้ใช้หลักที่ได้รับอนุญาตโดยตรงของรายการ ง
  • ทั้งรายการ D และรายการ E ต่างก็รับค่า ACL ของรายการ A
  • รายการ D ตั้งชื่อรายการ A เป็นคอนเทนเนอร์
  • รายการ A และ E เป็นรายการระดับรากเนื่องจากไม่มีรายการคอนเทนเนอร์

ลบการเรียงซ้อนผ่านการอ้างอิงคอนเทนเนอร์ เมื่อลบรายการ A จะมีผลดังนี้

  • องค์ประกอบสืบทอดทั้งหมดของ setInheritFrom() จะไม่สามารถเข้าถึงผู้ใช้ทุกรายได้
  • ไม่มีผู้ใช้เข้าถึงรายการ A ได้
  • รายการ D ถูกลบโดยนัย ผู้ใช้ไม่สามารถเข้าถึงรายการ D
  • ระบบไม่ได้ลบรายการ E เนื่องจากการลบจะซ้อนกันผ่านการอ้างอิงคอนเทนเนอร์เท่านั้น
  • ไม่สามารถเข้าถึงรายการ จ และไม่มีผู้ใช้คนใดค้นหารายการ จ ได้