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

RBAC

การกำหนดบทบาท

การใช้งาน [role_definition] เพื่อกำหนดความสัมพันธ์การสืบทอดบทบาทใน RBAC Casbin รองรับการมีหลายอินสแตนซ์ของระบบ RBAC ที่ผู้ใช้สามารถมีบทบาทและความสัมพันธ์การสืบทอด และทรัพยากรก็สามารถมีบทบาทและความสัมพันธ์การสืบทอดได้เช่นกัน ระบบ RBAC ทั้งสองนี้จะไม่รบกวนกัน

ส่วนนี้เป็นส่วนที่ไม่จำเป็น หากคุณไม่ใช้บทบาท RBAC ในโมเดล ก็ข้ามส่วนนี้ไป

[role_definition]
g = _, _
g2 = _, _

การกำหนดบทบาทข้างต้นแสดงว่า g เป็นระบบ RBAC และ g2 เป็นอีกระบบ RBAC _,_ หมายความว่ามีสองฝ่ายที่เกี่ยวข้องในความสัมพันธ์การสืบทอด ในกรณีที่พบบ่อยที่สุด คุณมักจะใช้ g อย่างเดียวหากคุณต้องการบทบาทสำหรับผู้ใช้เท่านั้น คุณสามารถใช้ทั้ง g และ g2 เมื่อคุณต้องการบทบาท (หรือกลุ่ม) สำหรับทั้งผู้ใช้และทรัพยากร โปรดดูตัวอย่างที่ rbac_model.conf และ rbac_model_with_resource_roles.conf

Casbin เก็บการแมปปิ้งระหว่างผู้ใช้กับบทบาทจริง (หรือการแมปปิ้งระหว่างทรัพยากรกับบทบาทหากคุณใช้บทบาทกับทรัพยากร) ในนโยบาย ตัวอย่างเช่น:

p, data2_admin, data2, read
g, alice, data2_admin

หมายความว่า alice สืบทอด/เป็นสมาชิกของบทบาท data2_admin ที่นี่ alice สามารถเป็นผู้ใช้ ทรัพยากร หรือบทบาท Casbin รู้จักมันเป็นเพียงสตริง

จากนั้น ในตัวตรงกัน คุณควรตรวจสอบบทบาทตามที่แสดงด้านล่าง:

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

หมายความว่า sub ในคำขอควรมีบทบาท sub ในนโยบาย

หมายเหตุ
  1. Casbin เก็บเฉพาะการแมปปิ้งระหว่างผู้ใช้กับบทบาท
  2. Casbin ไม่ตรวจสอบว่าผู้ใช้เป็นผู้ใช้ที่ถูกต้องหรือบทบาทเป็นบทบาทที่ถูกต้องหรือไม่ สิ่งนั้นควรได้รับการดูแลโดยการตรวจสอบสิทธิ์
  3. อย่าใช้ชื่อเดียวกันสำหรับผู้ใช้และบทบาทภายในระบบ RBAC เพราะ Casbin รู้จักผู้ใช้และบทบาทเป็นสตริง และไม่มีทางที่ Casbin จะรู้ว่าคุณกำลังระบุผู้ใช้ alice หรือบทบาท alice คุณสามารถแก้ไขได้ง่ายๆ โดยใช้ role_alice
  4. หาก A มีบทบาท B และ B มีบทบาท C แล้ว A ก็จะมีบทบาท C ความสัมพันธ์นี้เป็นไปอย่างไม่มีที่สิ้นสุดในตอนนี้
การกำหนดชื่อโทเค็น

ตามปกติ ชื่อโทเค็นของผู้ใช้ในการกำหนดนโยบายคือ sub และวางไว้ที่ต้น ตอนนี้ Golang Casbin รองรับชื่อโทเค็นที่กำหนดเองและตำแหน่งที่กำหนดเอง หากชื่อโทเค็นของผู้ใช้คือ sub โทเค็นของผู้ใช้สามารถวางไว้ที่ตำแหน่งใดก็ได้โดยไม่ต้องทำอะไรเพิ่มเติม หากชื่อโทเค็นของผู้ใช้ไม่ใช่ sub ควรเรียก e.SetFieldIndex() สำหรับ constant.SubjectIndex หลังจากที่ตัวบังคับใช้ถูกเริ่มต้น ไม่ว่าจะอยู่ในตำแหน่งใดก็ตาม

# `subject` here is for sub
[policy_definition]
p = obj, act, subject
e.SetFieldIndex("p", constant.SubjectIndex, 2) // index starts from 0
ok, err := e.DeleteUser("alice") // without SetFieldIndex, it will raise an error

ลำดับชั้นบทบาท

RBAC ของ Casbin รองรับคุณสมบัติลำดับชั้นบทบาทของ RBAC1 ซึ่งหมายความว่าหาก alice มี role1 และ role1 มี role2 แล้ว alice จะมี role2 และสืบทอดสิทธิ์ของมัน

ที่นี่ เรามีแนวคิดที่เรียกว่าระดับลำดับชั้น ดังนั้น ในตัวอย่างนี้ ระดับลำดับชั้นคือ 2 สำหรับตัวจัดการบทบาทที่มีอยู่ใน Casbin คุณสามารถระบุระดับลำดับชั้นสูงสุดได้ ค่าเริ่มต้นคือ 10 นี่หมายความว่าผู้ใช้ปลายทางเช่น alice สามารถสืบทอดบทบาทได้เพียง 10 ระดับ

// NewRoleManager is the constructor for creating an instance of the
// default RoleManager implementation.
func NewRoleManager(maxHierarchyLevel int) rbac.RoleManager {
rm := RoleManager{}
rm.allRoles = &sync.Map{}
rm.maxHierarchyLevel = maxHierarchyLevel
rm.hasPattern = false

return &rm
}

วิธีการแยกแยะบทบาทจากผู้ใช้?

Casbin ไม่แยกแยะระหว่างบทบาทและผู้ใช้ใน RBAC ของมัน ทั้งสองถูกมองเป็นสตริง หากคุณใช้ RBAC แบบเดียว (ที่บทบาทจะไม่เคยเป็นสมาชิกของบทบาทอื่น) คุณสามารถใช้ e.GetAllSubjects() เพื่อรับผู้ใช้ทั้งหมดและ e.GetAllRoles() เพื่อรับบทบาททั้งหมด พวกเขาจะแสดงรายการทั้งหมด u และทั้งหมด r ตามลำดับ ในกฎ g, u, r ทั้งหมด

แต่ถ้าคุณใช้ RBAC หลายระดับ (ที่มีลำดับชั้นบทบาท) และแอปพลิเคชันของคุณไม่บันทึกว่าชื่อ (สตริง) เป็นผู้ใช้หรือบทบาท หรือคุณมีผู้ใช้และบทบาทที่มีชื่อเดียวกัน คุณสามารถเพิ่มคำนำหน้าให้กับบทบาทเช่น role::admin ก่อนที่จะส่งไปยัง Casbin วิธีนี้ คุณจะรู้ว่ามันเป็นบทบาทโดยการตรวจสอบคำนำหน้านี้

วิธีการค้นหาบทบาทหรือสิทธิ์ที่เป็นนัย?

เมื่อผู้ใช้สืบทอดบทบาทหรือสิทธิ์ผ่านลำดับชั้น RBAC แทนที่จะได้รับมอบหมายโดยตรงในกฎนโยบาย เราเรียกประเภทของการมอบหมายนี้ว่า 'implicit' เพื่อค้นหาความสัมพันธ์ที่เป็นนัยเช่นนี้ คุณต้องใช้ API สองตัวนี้: GetImplicitRolesForUser() และ GetImplicitPermissionsForUser() แทน GetRolesForUser() และ GetPermissionsForUser() สำหรับรายละเอียดเพิ่มเติม โปรดดู this GitHub issue

การใช้การจับคู่รูปแบบใน RBAC

ดู RBAC with Pattern

ผู้จัดการบทบาท

ดูส่วน Role Managers สำหรับรายละเอียด