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

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