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)