ข้ามไปยังเนื้อหาหลัก

Menu Permissions

เราเริ่มต้นด้วยการแนะนำตัวอย่าง Spring Boot ที่มีระบบเมนู ตัวอย่างนี้ใช้ jCasbin เพื่อจัดการสิทธิ์การเข้าถึงเมนู ในที่สุด มันมุ่งหวังที่จะสรุปเป็นมิดเดิลแวร์ โดยเฉพาะสำหรับสิทธิ์การเข้าถึงเมนู ซึ่งสามารถขยายไปยังภาษาอื่นที่ Casbin รองรับ เช่น Go และ Python

1. ไฟล์การตั้งค่า

คุณต้องตั้งค่าการจัดการบทบาทและสิทธิ์ในไฟล์ policy.csv พร้อมกับความสัมพันธ์แบบพ่อแม่-ลูกของรายการเมนู สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ this GitHub repo

1.1 ภาพรวม

โดยใช้ policy.csv คุณสามารถกำหนดค่าสิทธิ์บทบาทและโครงสร้างเมนูได้อย่างยืดหยุ่นสำหรับการควบคุมการเข้าถึงอย่างละเอียด ไฟล์การตั้งค่านี้กำหนดสิทธิ์การเข้าถึงสำหรับบทบาทต่างๆ บนรายการเมนูต่างๆ ความสัมพันธ์ระหว่างผู้ใช้และบทบาท และความสัมพันธ์แบบลำดับชั้นระหว่างรายการเมนู

1.2 คำจำกัดความของสิทธิ์ (นโยบาย)

  • กฎนโยบาย: นโยบายถูกกำหนดด้วยคำนำหน้า p โดยระบุบทบาท (sub) และสิทธิ์ของพวกเขา (act) บนรายการเมนู (obj) พร้อมกับผลของกฎ (eft) ที่ allow หมายถึงได้รับอนุญาต และ deny หมายถึงถูกปฏิเสธ

ตัวอย่าง:

  • p, ROLE_ROOT, SystemMenu, read, allow หมายความว่าบทบาท ROLE_ROOT มีสิทธิ์อ่านเมนู SystemMenu
  • p, ROLE_ROOT, UserMenu, read, deny หมายความว่าบทบาท ROLE_ROOT ถูกปฏิเสธสิทธิ์อ่านเมนู UserMenu

1.3 บทบาทและความสัมพันธ์ของผู้ใช้

  • การสืบทอดบทบาท: ความสัมพันธ์ของผู้ใช้-บทบาทและลำดับชั้นของบทบาทถูกกำหนดด้วยคำนำหน้า g สิ่งนี้ช่วยให้ผู้ใช้สามารถสืบทอดสิทธิ์จากบทบาทหนึ่งหรือหลายบทบาท

ตัวอย่าง:

  • g, user, ROLE_USER หมายความว่าผู้ใช้ user ได้รับมอบหมายบทบาท ROLE_USER
  • g, ROLE_ADMIN, ROLE_USER หมายความว่า ROLE_ADMIN สืบทอดสิทธิ์จาก ROLE_USER

1.4 ลำดับชั้นของรายการเมนู

  • ความสัมพันธ์ของเมนู: ความสัมพันธ์แบบพ่อแม่-ลูกของรายการเมนูถูกกำหนดด้วยคำนำหน้า g2 ช่วยในการสร้างโครงสร้างของเมนู

ตัวอย่าง:

  • g2, UserSubMenu_allow, UserMenu บ่งชี้ว่า UserSubMenu_allow เป็นเมนูย่อยของ UserMenu
  • g2, (NULL), SystemMenu บ่งชี้ว่า SystemMenu ไม่มีเมนูย่อย หมายความว่าเป็นเมนูระดับบนสุด

1.5 การสืบทอดสิทธิ์เมนูและกฎเริ่มต้น

เมื่อจัดการสิทธิ์เมนูด้วย jCasbin ความสัมพันธ์ของสิทธิ์ระหว่างเมนูพ่อแม่และเมนูลูกตามกฎการสืบทอดเฉพาะ พร้อมกับสองกฎเริ่มต้นที่สำคัญ:

การสืบทอดสิทธิ์ของเมนูพ่อแม่:

หากเมนูพ่อแม่ได้รับอนุญาต allow อย่างชัดเจน ทุกเมนูย่อยของมันก็จะเริ่มต้นด้วยสิทธิ์ allow เว้นแต่จะถูกทำเครื่องหมายเป็น deny โดยเฉพาะ นั่นหมายความว่าเมื่อเมนูพ่อแม่สามารถเข้าถึงได้ เมนูย่อยของมันก็สามารถเข้าถึงได้โดยค่าเริ่มต้น

การจัดการเมนูพ่อแม่ที่ไม่มีการตั้งค่าสิทธิ์โดยตรง:

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

1.6 กฎการสืบทอดสิทธิ์พิเศษ

เกี่ยวกับการสืบทอดสิทธิ์ระหว่างบทบาท โดยเฉพาะในสถานการณ์ที่เกี่ยวข้องกับสิทธิ์ deny กฎต่อไปนี้ต้องถูกปฏิบัติตามเพื่อรับประกันความปลอดภัยของระบบและการควบคุมสิทธิ์อย่างแม่นยำ:

การแยกแยะระหว่างการปฏิเสธอย่างชัดเจนและการปฏิเสธเริ่มต้น:

หากบทบาท เช่น ROLE_ADMIN ถูกปฏิเสธการเข้าถึงรายการเมนูอย่างชัดเจน เช่น AdminSubMenu_deny (ทำเครื่องหมายเป็น deny) แล้วแม้ว่าบทบาทนี้จะถูกสืบทอดโดยบทบาทอื่น (เช่น ROLE_ROOT) บทบาทที่สืบทอดมาก็ไม่ได้รับอนุญาตให้เข้าถึงรายการเมนูที่ถูกปฏิเสธ สิ่งนี้รับประกันว่านโยบายความปลอดภัยที่ชัดเจนจะไม่ถูกบypassเนื่องจากการสืบทอดบทบาท

การสืบทอดสิทธิ์การปฏิเสธเริ่มต้น:

ในทางกลับกัน หากการปฏิเสธการเข้าถึงรายการเมนูของบทบาท (เช่น UserSubMenu_deny) เป็นเริ่มต้น (ไม่ได้ทำเครื่องหมายเป็น deny แต่เพราะไม่ได้รับอนุญาต allow อย่างชัดเจน) แล้วเมื่อบทบาทนี้ถูกสืบทอดโดยบทบาทอื่น (เช่น ROLE_ADMIN) บทบาทที่สืบทอดมาอาจแทนที่สถานะ deny เริ่มต้น อนุญาตให้เข้าถึงรายการเมนูเหล่านี้ได้

1.7 คำอธิบายตัวอย่าง

policy:

p, ROLE_ROOT, SystemMenu, read, allow
p, ROLE_ROOT, AdminMenu, read, allow
p, ROLE_ROOT, UserMenu, read, deny
p, ROLE_ADMIN, UserMenu, read, allow
p, ROLE_ADMIN, AdminMenu, read, allow
p, ROLE_ADMIN, AdminSubMenu_deny, read, deny
p, ROLE_USER, UserSubMenu_allow, read, allow

g, user, ROLE_USER
g, admin, ROLE_ADMIN
g, root, ROLE_ROOT
g, ROLE_ADMIN, ROLE_USER

g2, UserSubMenu_allow, UserMenu
g2, UserSubMenu_deny, UserMenu
g2, UserSubSubMenu, UserSubMenu_allow
g2, AdminSubMenu_allow, AdminMenu
g2, AdminSubMenu_deny, AdminMenu
g2, (NULL), SystemMenu
MenuNameROLE_ROOTROLE_ADMINROLE_USER
SystemMenu
UserMenu
UserSubMenu_allow
UserSubSubMenu
UserSubMenu_deny
AdminMenu
AdminSubMenu_allow
AdminSubMenu_deny

2. การควบคุมสิทธิ์เมนู

รายการของทุกเมนูที่สามารถเข้าถึงได้โดยชื่อผู้ใช้ที่กำหนดสามารถระบุได้ผ่านฟังก์ชัน findAccessibleMenus() ที่มีให้ใน MenuService เพื่อตรวจสอบว่าผู้ใช้เฉพาะมีสิทธิ์เข้าถึงรายการเมนูที่กำหนดหรือไม่ สามารถใช้เมธอด checkMenuAccess() วิธีการนี้รับประกันว่าการควบคุมสิทธิ์เมนูจะได้รับการจัดการอย่างมีประสิทธิภาพ โดยใช้ความสามารถของ jCasbin เพื่อจัดการสิทธิ์การเข้าถึงได้อย่างมีประสิทธิภาพ