คุณควรจัดทำดัชนีรายการด้วยรายการควบคุมการเข้าถึง (ACL) จากที่เก็บขององค์กร เพื่อให้มีเพียงผู้ใช้ที่มีสิทธิ์เข้าถึงรายการหนึ่งๆ เท่านั้นที่จะเห็นรายการดังกล่าวในผลการค้นหา คุณต้องสร้างโมเดล ACL ของที่เก็บและรวม ACL เหล่านั้นเมื่อจัดทำดัชนีรายการในที่เก็บ SDK ของเครื่องมือเชื่อมต่อเนื้อหามีชุดเมธอด ACL มากมายที่มีประสิทธิภาพเพียงพอที่จะสร้างแบบจำลอง ACL ของที่เก็บส่วนใหญ่
สร้าง ACL
การสร้าง ACL เป็นกระบวนการที่มี 2 ขั้นตอน ดังนี้
- สร้าง
Principal
โดยใช้เมธอดแบบคงที่ในคลาส ACL - ใช้คลาส
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 ดังนี้
- ผู้ใช้ 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
การแยกการรับช่วงค่า ACL จากลำดับชั้นการยับยั้งช่วยให้คุณทำโมเดลโครงสร้างที่มีอยู่จำนวนมากได้
เมื่อลบรายการเรียบร้อยแล้ว สิ่งที่จะเกิดขึ้นมีดังนี้
- รายการที่มีรายการที่ถูกลบจะไม่สามารถค้นหาได้และมีการกำหนดเวลาให้ระบบลบจากแหล่งข้อมูลของ Google
- คุณจะค้นหารายการที่ระบุรายการที่ถูกลบโดยใช้เมธอด
setInheritFrom()
ไม่ได้
หากทรัพยากรมีรายการที่ลบแล้วโดยใช้เมธอด setInheritFrom()
แต่ไม่มีชุดคอนเทนเนอร์ที่ใช้
setContainer()
หรือลำดับชั้นการควบคุมไม่มีรายการที่ลบไปแล้ว รายการนั้นและข้อมูลจะยังคงอยู่ในแหล่งข้อมูลของ Google คุณต้องรับผิดชอบในการลบรายการดังกล่าว
รูปที่ 3 แสดงตัวอย่างวิธีการทำงานของการลบในลำดับชั้นรายการ
การควบคุมการเข้าถึงเหล่านี้แสดงอยู่ในรูปที่ 3
- ผู้ใช้ 1 เป็นผู้ใช้หลักที่อนุญาตโดยตรงของรายการ A
- ผู้ใช้ 2 เป็นผู้ใช้หลักที่ได้รับอนุญาตโดยตรงของรายการ ง
- ทั้งรายการ D และรายการ E ต่างก็รับค่า ACL ของรายการ A
- รายการ D ตั้งชื่อรายการ A เป็นคอนเทนเนอร์
- รายการ A และ E เป็นรายการระดับรากเนื่องจากไม่มีรายการคอนเทนเนอร์
ลบการเรียงซ้อนผ่านการอ้างอิงคอนเทนเนอร์ เมื่อลบรายการ A จะมีผลดังนี้
- องค์ประกอบสืบทอดทั้งหมดของ
setInheritFrom()
จะไม่สามารถเข้าถึงผู้ใช้ทุกรายได้ - ไม่มีผู้ใช้เข้าถึงรายการ A ได้
- รายการ D ถูกลบโดยนัย ผู้ใช้ไม่สามารถเข้าถึงรายการ D
- ระบบไม่ได้ลบรายการ E เนื่องจากการลบจะซ้อนกันผ่านการอ้างอิงคอนเทนเนอร์เท่านั้น
- ไม่สามารถเข้าถึงรายการ จ และไม่มีผู้ใช้คนใดค้นหารายการ จ ได้