Bỏ qua đến nội dung chính

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)