Model Storage
Không giống như chính sách, mô hình chỉ có thể được tải, không thể được lưu. Chúng tôi tin rằng mô hình không phải là một thành phần động và không nên được sửa đổi trong thời gian chạy, vì vậy chúng tôi đã không triển khai một API để lưu mô hình vào bộ nhớ.
Tuy nhiên, có tin tốt. Chúng tôi cung cấp ba cách tương đương để tải một mô hình, cho dù tĩnh hay động:
Tải mô hình từ tệp .CONF
Đây là cách phổ biến nhất để sử dụng Casbin. Nó dễ hiểu cho người mới bắt đầu và thuận tiện để chia sẻ khi bạn cần giúp đỡ từ nhóm Casbin.
Nội dung của tệp .CONF
examples/rbac_model.conf như sau:
[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
Sau đó, bạn có thể tải tệp mô hình như sau:
e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")
Tải mô hình từ mã nguồn
Mô hình có thể được khởi tạo động từ mã nguồn thay vì sử dụng tệp .CONF
. Dưới đây là một ví dụ cho mô hình 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)
Tải mô hình từ chuỗi
Ngoài ra, bạn có thể tải toàn bộ văn bản mô hình từ một chuỗi nhiều dòng. Ưu điểm của phương pháp này là bạn không cần phải duy trì một tệp mô hình.
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)