How It Works
ใน Casbin, โมเดลการควบคุมการเข้าถึงถูกสรุปเป็นไฟล์ CONF ตาม PERM metamodel (Policy, Effect, Request, Matchers) การเปลี่ยนหรืออัพเกรดกลไกการอนุญาตสำหรับโปรเจกต์นั้นง่ายเหมือนการแก้ไขการตั้งค่า คุณสามารถปรับแต่งโมเดลการควบคุมการเข้าถึงของคุณเองได้โดยการรวมโมเดลที่มีอยู่ ตัวอย่างเช่น คุณสามารถรวมบทบาท RBAC และคุณสมบัติ ABAC เข้าด้วยกันภายในโมเดลเดียวและแชร์ชุดกฎนโยบายเดียวกัน
โมเดล PERM ประกอบด้วยสี่รากฐาน: Policy, Effect, Request และ Matchers รากฐานเหล่านี้อธิบายความสัมพันธ์ระหว่างทรัพยากรและผู้ใช้
Request
กำหนดพารามิเตอร์ของคำขอ คำขอพื้นฐานเป็นวัตถุทูเพิล ต้องการอย่างน้อยหนึ่งเรื่อง (เอนทิตีที่เข้าถึง), วัตถุ (ทรัพยากรที่เข้าถึง) และการกระทำ (วิธีการเข้าถึง)
ตัวอย่างเช่น คำนิยามคำขออาจมีลักษณะดังนี้: r={sub,obj,act}
คำนิยามนี้ระบุชื่อพารามิเตอร์และการเรียงลำดับที่ต้องการโดยฟังก์ชันการจับคู่การควบคุมการเข้าถึง
Policy
กำหนดโมเดลสำหรับกลยุทธ์การเข้าถึง มันระบุชื่อและลำดับของฟิลด์ในเอกสารกฎนโยบาย
ตัวอย่างเช่น: p={sub, obj, act}
หรือ p={sub, obj, act, eft}
หมายเหตุ: หาก eft (ผลลัพธ์นโยบาย) ไม่ได้กำหนด ฟิลด์ผลลัพธ์ในไฟล์นโยบายจะไม่ถูกอ่าน และผลลัพธ์นโยบายที่จับคู่จะได้รับอนุญาตโดยค่าเริ่มต้น
Matcher
กำหนดกฎการจับคู่สำหรับคำขอและนโยบาย
ตัวอย่างเช่น: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
กฎการจับคู่ง่ายและทั่วไปนี้หมายความว่าหากพารามิเตอร์ที่ร้องขอ (เอนทิตี, ทรัพยากร และวิธีการ) เท่ากับที่พบในนโยบาย ผลลัพธ์นโยบาย (p.eft
) จะถูกส่งกลับ ผลลัพธ์ของกลยุทธ์จะถูกบันทึกใน p.eft
Effect
ทำการตัดสินใจการรวมตรรกะบนผลลัพธ์การจับคู่ของ Matchers
ตัวอย่างเช่น: e = some(where(p.eft == allow))
คำสั่งนี้หมายความว่าหากผลลัพธ์กลยุทธ์การจับคู่ p.eft
มีผลลัพธ์ของ (บางส่วน) อนุญาต ผลลัพธ์สุดท้ายจะเป็นจริง
มาดูตัวอย่างอื่นกัน:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
ความหมายตรรกะของการรวมตัวอย่างนี้คือ: ถ้ามีกลยุทธ์ที่จับคู่ผลลัพธ์ของอนุญาตและไม่มีกลยุทธ์ที่จับคู่ผลลัพธ์ของปฏิเสธ ผลลัพธ์จะเป็นจริง กล่าวคือ มันเป็นจริงเมื่อกลยุทธ์การจับคู่ทั้งหมดเป็นอนุญาต ถ้ามีการปฏิเสธใด ๆ ทั้งสองจะเป็นเท็จ (ง่ายกว่านั้น คือ เมื่ออนุญาตและปฏิเสธมีอยู่ในเวลาเดียวกัน ปฏิเสธจะมีความสำคัญกว่า)
โมเดลที่พื้นฐานและง่ายที่สุดใน Casbin คือ ACL โมเดล CONF สำหรับ ACL มีดังนี้:
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
ตัวอย่างนโยบายสำหรับโมเดล ACL คือ:
p, alice, data1, read
p, bob, data2, write
นี่หมายความว่า:
- alice สามารถอ่าน data1
- bob สามารถเขียน data2
เรายังรองรับโหมดหลายบรรทัดโดยการเติม '' ที่ปลาย:
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act
นอกจากนี้ ถ้าคุณกำลังใช้ ABAC คุณสามารถลองใช้ตัวดำเนินการ 'in' ตามที่แสดงในตัวอย่างต่อไปนี้สำหรับรุ่น golang ของ Casbin (jCasbin และ Node-Casbin ยังไม่ได้รับการสนับสนุน):
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
แต่คุณ ต้อง แน่ใจว่าความยาวของอาร์เรย์นั้น มากกว่า 1, ไม่เช่นนั้นจะทำให้เกิด panic
สำหรับตัวดำเนินการเพิ่มเติม คุณอาจดูที่ govaluate