สมมติว่าโครงสร้างฐานข้อมูลต่อไปนี้ (แก้ไขได้ถ้าต้องการ) ...
ฉันกำลังมองหาวิธีที่ดีในการพิจารณา "สิทธิ์ที่มีประสิทธิภาพ" สำหรับผู้ใช้ที่ได้รับในหน้าเว็บที่กำหนดในวิธีที่ช่วยให้ฉันกลับแถวที่มีหน้าและสิทธิ์ที่มีประสิทธิภาพ
ฉันคิดว่าทางออกที่ดีที่สุดอาจรวมถึงฟังก์ชันที่ใช้ CTE เพื่อดำเนินการเรียกซ้ำที่จำเป็นในการประเมิน "การอนุญาตที่มีประสิทธิภาพ" สำหรับแถวหน้าที่กำหนดสำหรับผู้ใช้ปัจจุบัน
ความเป็นมาและรายละเอียดการใช้งาน
สคีมาด้านบนแสดงถึงจุดเริ่มต้นสำหรับระบบการจัดการเนื้อหาที่ผู้ใช้สามารถได้รับอนุญาตโดยการเพิ่มและลบออกจากบทบาท
ทรัพยากรในระบบ (เช่นหน้า) เกี่ยวข้องกับบทบาทเพื่อให้กลุ่มผู้ใช้ที่เชื่อมโยงกับบทบาทนั้นได้รับอนุญาต
แนวคิดคือเพื่อให้สามารถล็อกผู้ใช้ได้ง่ายโดยเพียงแค่ปฏิเสธบทบาททั้งหมดและเพิ่มเพจระดับรูทในทรีให้กับบทบาทนั้นจากนั้นเพิ่มผู้ใช้เข้ากับบทบาทนั้น
สิ่งนี้จะช่วยให้โครงสร้างการอนุญาตยังคงอยู่เมื่อ (ตัวอย่าง) ผู้รับเหมาที่ทำงานให้ บริษัท ไม่พร้อมใช้งานเป็นเวลานานจากนั้นจะอนุญาตให้มีการอนุญาตแบบเดิมโดยเพียงแค่ลบผู้ใช้ออกจากบทบาทนั้น .
การอนุญาตขึ้นอยู่กับกฎชนิด ACL ทั่วไปที่อาจนำไปใช้กับระบบไฟล์โดยทำตามกฎเหล่านี้
สิทธิ์ CRUD จะเป็นบิตที่ไม่สามารถใช้ได้ดังนั้นค่าที่มีอยู่จะเป็นจริง, เท็จ, ไม่ได้กำหนดไว้โดยที่ข้อมูลต่อไปนี้เป็นจริง:
- false + Anything = false
- จริง + ไม่ได้กำหนด = จริง
- จริง + จริง = จริง
- ไม่ได้กำหนด + ไม่ได้กำหนด = ไม่ได้กำหนดไว้
หากการอนุญาตใด ๆ เป็นเท็จ -> เท็จ ถ้ามีจริง -> จริง อื่น (ไม่ได้กำหนดทั้งหมด) -> false
กล่าวอีกนัยหนึ่งคุณจะไม่ได้รับอนุญาตใด ๆ ยกเว้นคุณได้รับสิทธิ์ผ่านการเป็นสมาชิกบทบาทและกฎปฏิเสธจะแทนที่กฎการอนุญาต
"การตั้งค่า" ของการอนุญาตที่ใช้กับนี้คือการอนุญาตทั้งหมดที่นำมาใช้กับต้นไม้จนถึงและรวมถึงหน้าปัจจุบันในคำอื่น ๆ : หากเท็จอยู่ในบทบาทใด ๆ ที่ใช้กับหน้าใด ๆ ในต้นไม้ที่หน้านี้ผลที่ได้คือเท็จ แต่ถ้าไม่ได้กำหนดทรีทั้งหมดถึงที่นี่หน้าปัจจุบันจะมีกฎที่แท้จริงผลลัพธ์จะเป็นจริงที่นี่ แต่อาจเป็นเท็จสำหรับผู้ปกครอง
ฉันต้องการเก็บโครงสร้าง db ไว้อย่างหลวม ๆ หากเป็นไปได้โปรดจำไว้ว่าเป้าหมายของฉันที่นี่คือสามารถทำสิ่งต่าง ๆ เช่นselect * from pages where effective permissions (read = true) and user = ?
ดังนั้นวิธีแก้ไขปัญหาใด ๆ ควรจะอนุญาตให้ฉันมีชุดคำถามที่น่าสงสัยด้วยสิทธิ์ที่มีประสิทธิภาพในนั้น ด้วยวิธีใดวิธีหนึ่ง (การส่งคืนเป็นตัวเลือกตราบใดที่เกณฑ์สามารถระบุได้)
สมมติว่ามี 2 หน้าโดยที่ 1 เป็นลูกของอีกบทบาทและ 2 มีอยู่หนึ่งสำหรับผู้ใช้ผู้ดูแลระบบและ 1 สำหรับผู้ใช้อ่านอย่างเดียวทั้งสองเชื่อมโยงกับหน้าระดับรากเท่านั้นที่ฉันคาดว่าจะเห็นสิ่งนี้เป็นผลลัพธ์ที่คาดหวัง:
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False
การอภิปรายต่อไปรอบ ๆ คำถามนี้สามารถพบได้ในห้องแชทหลักเริ่มต้นที่นี่