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
MenuName | ROLE_ROOT | ROLE_ADMIN | ROLE_USER |
---|---|---|---|
SystemMenu | ✅ | ❌ | ❌ |
UserMenu | ❌ | ✅ | ❌ |
UserSubMenu_allow | ❌ | ✅ | ✅ |
UserSubSubMenu | ❌ | ✅ | ✅ |
UserSubMenu_deny | ❌ | ✅ | ❌ |
AdminMenu | ✅ | ✅ | ❌ |
AdminSubMenu_allow | ✅ | ✅ | ❌ |
AdminSubMenu_deny | ✅ | ❌ | ❌ |
2. การควบคุมสิทธิ์เมนู
รายการของทุกเมนูที่สามารถเข้าถึงได้โดยชื่อผู้ใช้ที่กำหนดสามารถระบุได้ผ่านฟังก์ชัน findAccessibleMenus()
ที่มีให้ใน MenuService เพื่อตรวจสอบว่าผู้ใช้เฉพาะมีสิทธิ์เข้าถึงรายการเมนูที่กำหนดหรือไม่ สามารถใช้เมธอด checkMenuAccess()
วิธีการนี้รับประกันว่าการควบคุมสิทธิ์เมนูจะได้รับการจัดการอย่างมีประสิทธิภาพ โดยใช้ความสามารถของ jCasbin เพื่อจัดการสิทธิ์การเข้าถึงได้อย่างมีประสิทธิภาพ