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

Model Storage

ไม่เหมือนกับนโยบาย, โมเดลสามารถโหลดได้เท่านั้น ไม่สามารถบันทึกได้ เราเชื่อว่าโมเดลไม่ใช่ส่วนประกอบที่เปลี่ยนแปลงได้ และไม่ควรถูกแก้ไขขณะทำงาน, ดังนั้นเราจึงไม่ได้ทำการพัฒนา API สำหรับบันทึกโมเดลเข้าสู่การจัดเก็บ

อย่างไรก็ตาม, มีข่าวดี เรามีวิธีการโหลดโมเดลทั้งหมดสามวิธีที่เท่าเทียมกัน, ไม่ว่าจะเป็นแบบคงที่หรือแบบไดนามิก:

โหลดโมเดลจากไฟล์ .CONF

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

เนื้อหาของไฟล์ .CONF examples/rbac_model.conf มีดังต่อไปนี้:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

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

จากนั้นคุณสามารถโหลดไฟล์โมเดลตามวิธีต่อไปนี้:

e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

โหลดโมเดลจากโค้ด

โมเดลสามารถเริ่มต้นได้แบบไดนามิกจากโค้ดแทนที่จะใช้ไฟล์ .CONF นี่คือตัวอย่างสำหรับโมเดล RBAC:

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
"github.com/casbin/casbin/v2/persist/file-adapter"
)

// Initialize the model from Go code.
m := model.NewModel()
m.AddDef("r", "r", "sub, obj, act")
m.AddDef("p", "p", "sub, obj, act")
m.AddDef("g", "g", "_, _")
m.AddDef("e", "e", "some(where (p.eft == allow))")
m.AddDef("m", "m", "g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act")

// Load the policy rules from the .CSV file adapter.
// Replace it with your adapter to avoid using files.
a := fileadapter.NewAdapter("examples/rbac_policy.csv")

// Create the enforcer.
e := casbin.NewEnforcer(m, a)

โหลดโมเดลจากสตริง

หรือคุณสามารถโหลดข้อความโมเดลทั้งหมดจากสตริงหลายบรรทัด ข้อดีของวิธีนี้คือคุณไม่จำเป็นต้องดูแลไฟล์โมเดล

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
)

// Initialize the model from a string.
text :=
`
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
`
m, _ := model.NewModelFromString(text)

// Load the policy rules from the .CSV file adapter.
// Replace it with your adapter to avoid using files.
a := fileadapter.NewAdapter("examples/rbac_policy.csv")

// Create the enforcer.
e := casbin.NewEnforcer(m, a)